SlideShare uma empresa Scribd logo
Pré-processamento de
Grandes Dados com Apache
Spark
Rio Big Data Meetup - Novembro 2015
Felipe Almeida (falmeida1988@gmail.com | http://queirozf.com)
https://github.com/queirozfcom/rio-big-data-meetup-nov-2015
Estrutura da palestra
● Introdução
● O problema
● Spark
● Spark Dataframes
● Spark UDFs
● Spark ml
● Estudo de caso
2/28
Introdução
● Tarefas de mineração de dados e aprendizado de máquina só são
possíveis após uma etapa de pré-processamento.
● Pergunta: como pré-processar dados da ordem de muitos GB ou
TB?
● Hadoop e Spark
● As versões recentes do Spark adicionaram recursos úteis para
essas tarefas.
3/28
O problema
● Vamos tratar especificamente do problema de extração de
features
○ Isto é, transformar uma massa de dados em um conjunto de
dados onde cada amostra é representada por um vetor de
features
4/28
Spark
● Framework para computação em cluster, feito em Scala.
● Nasceu para resolver dois problemas do Hadoop:
○ Necessidade de persistir em disco após cada job
○ Difícil utilização para tarefas interativas
● Abstração principal: RDD
○ Um dataset distribuído nos nós do cluster
● Suporta várias operações além das famosas map e reduce
5/28
Spark
6/28
carrega um arquivo texto do HDFS
cada linha é transformada em uma lista de
palavras
exemplo de programa Spark usando Python (wordcount)
cada palavra é transformada em uma tupla
(palavra,1)
os pares com a mesma chave (i.e. mesma palavra) são
agrupados e somados
Spark DataFrames
● O módulo spark-sql adicionou o conceito de DataFrames
○ Como usado na linguagem R ou na biblioteca pandas (Python)
● Um DataFrame é comumente utilizado para representar um
dataset:
○ Linhas representam cada amostra (ponto)
○ Colunas representam cada feature
● Também é um RDD
○ Do tipo RDD[sql.Row]
○ Suporta também todas as operações de RDD
7/28
Spark DataFrames
● Esquema de um DataFrame NxD (N amostras, D features)
8/28
feature #1 feature #2 feature #3 ... feature #D
amostra #1 ...
amostra #2 ...
amostra #3 ...
... ... ... ... ... ...
amostra #N ...
Spark DataFrames
// dataframes moram neste módulo
import org.apache.spark.sql._
// construindo um sqlcontext a partir do sparkcontext
val sqlContext = new SQLContext(sc)
// carregando dados do S3 (schema inferido automaticamente)
val df = sqlContext.read.json("s3://path/to/dataset")
// select from dataframe where overall > 4.0
df.where(df("overall") > 4.0)
9/28
Spark DataFrames - transformações
Exemplo: feature scaling (normalização de features)
DataFrame original DataFrame modificado
aplicação da
transformação
de
normalização
10/28
feature #1 feature #2
amostra #1 2 400
amostra #2 4 200
amostra #3 6 400
feature #1 feature #2
amostra #1 0 1
amostra #2 0.5 0
amostra #3 1 1
Spark DataFrames - transformações
Exemplo: tokenização (separar texto em tokens)
DataFrame original DataFrame modificado
11/28
feature #1
amostra #1 “olá mundo!!”
amostra #2 “spark para grandes
dados”
amostra #3 “usando spark”
aplicação da
transformação
de tokenização
feature #1’
amostra #1 [“olá”, “mundo”]
amostra #2 [“spark”, “para”,
“grandes”, “dados”]
amostra #3 [“usando”,”spark”]
Spark UDFs
● UDFs: User-defined functions
○ São funções que atuam sobre uma coluna de um DataFrame
● Note a diferença com relações a funções como filter, map,
reduce que atuam sobre uma linha de um DataFrame
12/28
Spark UDFs
● UDFs podem ser usadas para criar colunas em um DataFrame:
import org.apache.spark.sql.functions.udf
// uma UDF que retorna o tamanho de uma string
val len = udf { str:String => str.length }
// aplicar a UDF len à coluna texto e criar uma
// nova coluna com o resultado
val df1 = df.withColumn("tamanho", len(df("texto"))
13/28
Spark UDFs
Resultado da aplicação da UDF len :
DataFrame df DataFrame df1
14/28
texto
amostra #1 “foo”
amostra #2 “foo bar”
amostra #3 “oi”
aplicação da
UDF len
tamanho
amostra #1 3
amostra #2 7
amostra #3 2
Spark ml
15/28
● spark.ml é um componente do módulo spark-mllib
● Disponibiliza, entre outras coisas, várias transformações baseadas em
UDFs para manipular um DataFrame
● Entre elas:
○ RegexTokenizer
○ OneHotEncoder
○ StringIndexer
○ MinMaxScaler
○ Bucketizer
Spark ml
● RegexTokenizer (String => Vector[String])
○ Tokeniza strings usando uma regex como delimitador
DataFrame df DataFrame df1
16/28
texto
amostra #1 “foo,bar”
amostra #2 “bar baz”
amostra #3 “foo.bar.baz”
aplicação do
RegexTokenizer
usando a regex
/s+|,|./ como
delimitador
tokens
amostra #1 [“foo”,”bar”]
amostra #2 [“bar”,”baz”]
amostra #3 [“foo”,”bar”,”baz”]
Spark ml
● StringIndexer (String => Double)
○ Transforma valores únicos em índices numéricos
DataFrame df DataFrame df1
17/28
feature #1
amostra #1 “amarelo”
amostra #2 “azul”
amostra #3 “verde”
amostra #4 “amarelo”
aplicação do
StringIndexer
feature #1 mod
amostra #1 0.0
amostra #2 1.0
amostra #3 2.0
amostra #4 0.0
Spark ml
● OneHotEncoder (Double => Vector[Double])
○ Transforma índices de features em um domínio em um vetor one-hot
DataFrame df DataFrame df1
18/28
aplicação do
OneHotEncoder
feature #1
amostra #1 0.0
amostra #2 1.0
amostra #3 2.0
amostra #4 0.0
feature #1 mod
amostra #1 [1.0,0.0,0.0]
amostra #2 [0.0,1.0,0.0]
amostra #3 [0.0,0.0,1.0]
amostra #4 [1.0,0.0,0.0]
Spark ml
● MinMaxScaler (Vector[Double] => Vector[Double])
○ Normaliza os valores de uma coluna para o range [0,1]
DataFrame df DataFrame df1
19/28
aplicação do
MinMaxScaler
feature #1
amostra #1 [2.0,800]
amostra #2 [4.0,1200]
amostra #3 [8.0,600]
amostra #4 [16.0,200]
feature #1
amostra #1 [0.0,0.6]
amostra #2 [0.14,1.0]
amostra #3 [0.43,0.4]
amostra #4 [1.0,0.0]
Spark ml
● Bucketizer (Double => Double)
○ Discretiza features contínuas, usando limites
DataFrame df DataFrame df1
20/28
aplicação do
Bucketizer usando
os limites 100, 200,
500, 2000 e 5000
feature #1
amostra #1 329.23
amostra #2 123.38
amostra #3 3289.57
amostra #4 1982.376
feature #1’
amostra #1 1.0
amostra #2 0.0
amostra #3 3.0
amostra #4 2.0
Estudo de caso: Reviews Amazon
● Um estudo de caso mostrando várias etapas possíveis para um
dataset real
● Não é um processo completo, apenas alguns passos para motivar
os ouvintes e dar uma ideia das quantidades envolvidas
○ Usa UDFs e também o módulo spark-mllib
● Código completo em https://github.com/queirozfcom/rio-big-data-
meetup-nov-2015
○ Incluindo a criação dos clusters usando AWS EMR
21/28
O dataset
Cada elemento é uma review de um produto na Amazon.com
● ~ 55 Gb (após desempacotamento)
● ~ 82 Milhões de Reviews
● Maio/1996 - Julho/2014
● Formato Json
● Link: http://jmcauley.ucsd.edu/data/amazon/
22/28
O dataset
● Elemento de exemplo:
{
"reviewerID": "A2SUAM",
"asin": "00000",
"reviewerName": "J. McDonald",
"helpful": [2, 3],
"reviewText": "I bought this for ...",
"overall": 5.0,
"summary": "Heavenly Highway!",
"unixReviewTime": 1252800000
}
23/28
Passos do Pipeline de exemplo
1. Retirar linhas com elementos null
2. Adicionar features para:
a. O tamanho do texto do reviewText e do summary
b. Período do dia em que a review for feita (dia/noite)
c. Período da semana em que a review foi feita (dia útil/fim
de semana)
3. Juntar todo o texto corrido (reviewText + summary) em um único
campo, passar para minúsculas, tokenizar e transformar em um
vetor de frequências (TF)
4. Normalizar a nota (atributo overall)
5. Transformar o atributo helpful em um float e normalizar
24/28
Dicas Gerais / Lições aprendidas
● É melhor criar uma máquina EC2, baixar o dataset para ela e, de
lá, fazer upload para o S3
○ Se estiverem na mesma área, o processo é muito mais rápido
● Se usar AWS EMR, cuidado para não esquecer o cluster ligado!
○ Use --auto-terminate
● Habilitar dynamicAllocation
● Recomendo a API Scala pois as outras às vezes ficam defasadas
25/28
Mais informações
● Todo o código foi rodado no ambiente da AWS, usando o serviço
EMR (Elastic MapReduce), com o build emr-4.0.1
○ Todo o código usado pode ser obtido em https://github.
com/queirozfcom/rio-big-data-meetup-nov-2015
● Guia para criar um cluster Spark usando o serviço AWS Elastic
MapReduce (EMR)
● Guia para usar o Apache Zeppelin no AWS EMR
● Guia para criar UDFs (User-defined Functions) no Spark/pyspark
26/28
FIM
27/28
Agradecimentos
● Professor Alexandre Assis DSc. (orientador do trabalho original)
○ PESC/COPPE UFRJ
● Rosângela Oliveira (colega no trabalho original)
○ rmsilva@cos.ufrj.br
● Julian McAuley PhD. (fornecimento do dataset)
28/28

Mais conteúdo relacionado

Mais procurados (20)

PPTX
Spark introduction and architecture
Sohil Jain
 
PDF
A Thorough Comparison of Delta Lake, Iceberg and Hudi
Databricks
 
PDF
Maximum Overdrive: Tuning the Spark Cassandra Connector (Russell Spitzer, Dat...
DataStax
 
PDF
Spark and S3 with Ryan Blue
Databricks
 
PDF
Linux tuning to improve PostgreSQL performance
PostgreSQL-Consulting
 
PDF
Reading The Source Code of Presto
Taro L. Saito
 
PDF
Fig 9-03
Hironobu Suzuki
 
PPT
Banco de Dados Distribuídos - MySql
Adail Viana Neto
 
PDF
The Parquet Format and Performance Optimization Opportunities
Databricks
 
PDF
20090713 Hbase Schema Design Case Studies
Evan Liu
 
PPTX
Spark Shuffle Deep Dive (Explained In Depth) - How Shuffle Works in Spark
Bo Yang
 
PDF
Apache Flink internals
Kostas Tzoumas
 
PPTX
Rocks db state store in structured streaming
Balaji Mohanam
 
PDF
How We Optimize Spark SQL Jobs With parallel and sync IO
Databricks
 
PPSX
RAC - The Savior of DBA
Nikhil Kumar
 
PPTX
How Scylla Make Adding and Removing Nodes Faster and Safer
ScyllaDB
 
PDF
Linux-HA with Pacemaker
Kris Buytaert
 
PDF
MyRocks Deep Dive
Yoshinori Matsunobu
 
PDF
Optimising Geospatial Queries with Dynamic File Pruning
Databricks
 
PDF
Designing ETL Pipelines with Structured Streaming and Delta Lake—How to Archi...
Databricks
 
Spark introduction and architecture
Sohil Jain
 
A Thorough Comparison of Delta Lake, Iceberg and Hudi
Databricks
 
Maximum Overdrive: Tuning the Spark Cassandra Connector (Russell Spitzer, Dat...
DataStax
 
Spark and S3 with Ryan Blue
Databricks
 
Linux tuning to improve PostgreSQL performance
PostgreSQL-Consulting
 
Reading The Source Code of Presto
Taro L. Saito
 
Fig 9-03
Hironobu Suzuki
 
Banco de Dados Distribuídos - MySql
Adail Viana Neto
 
The Parquet Format and Performance Optimization Opportunities
Databricks
 
20090713 Hbase Schema Design Case Studies
Evan Liu
 
Spark Shuffle Deep Dive (Explained In Depth) - How Shuffle Works in Spark
Bo Yang
 
Apache Flink internals
Kostas Tzoumas
 
Rocks db state store in structured streaming
Balaji Mohanam
 
How We Optimize Spark SQL Jobs With parallel and sync IO
Databricks
 
RAC - The Savior of DBA
Nikhil Kumar
 
How Scylla Make Adding and Removing Nodes Faster and Safer
ScyllaDB
 
Linux-HA with Pacemaker
Kris Buytaert
 
MyRocks Deep Dive
Yoshinori Matsunobu
 
Optimising Geospatial Queries with Dynamic File Pruning
Databricks
 
Designing ETL Pipelines with Structured Streaming and Delta Lake—How to Archi...
Databricks
 

Semelhante a Pré processamento de grandes dados com Apache Spark (20)

PDF
Exemplos de uso de apache spark usando aws elastic map reduce
Felipe
 
PDF
Federal University of Santa Catarina (UFSC) - PySpark Tutorial
Luiz Henrique Zambom Santana
 
ODP
Palestra cbq
Rildo Pragana
 
PDF
[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...
Marcio Machado Pereira
 
KEY
Utilizando NoSQL no desenvolvimento de soluções inteligentes
Christiano Anderson
 
ODP
Aula c++ estruturas de dados
Jean Martina
 
PPT
Introdução Ruby 1.8.7 + Rails 3
Régis Eduardo Weizenmann Gregol
 
PDF
Mongodb workshop cinlug
Daker Fernandes
 
PDF
Mini-Curso de MongoDB
Brunno Gomes
 
PPTX
Node JS - Parte 2
Bruno Catão
 
PDF
Webinar: Arquitetura de software para sistemas embarcados
Embarcados
 
PDF
[Datafest 2018] Apache Spark Structured Stream - Moedor de dados em tempo qua...
Eiti Kimura
 
PPT
Desenvolvendo soluções com banco de dados não relacional - MongoDB
iMasters
 
PDF
PHPMyadmin - Introdução
Marco Pinheiro
 
PDF
Criando sua própria linguagem de programação
ronaldoferraz
 
PDF
Ruby & Rails
Sergio Henrique
 
PDF
pgModeler: muito mais que um modelador de bancos de dados PostgreSQL
Raphael Silva
 
PDF
Design Patterns para Tuning Pentaho com Ctools
e-Setorial
 
PPT
Dito Tech Talk RSpec
guest49d83b2
 
Exemplos de uso de apache spark usando aws elastic map reduce
Felipe
 
Federal University of Santa Catarina (UFSC) - PySpark Tutorial
Luiz Henrique Zambom Santana
 
Palestra cbq
Rildo Pragana
 
[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...
Marcio Machado Pereira
 
Utilizando NoSQL no desenvolvimento de soluções inteligentes
Christiano Anderson
 
Aula c++ estruturas de dados
Jean Martina
 
Introdução Ruby 1.8.7 + Rails 3
Régis Eduardo Weizenmann Gregol
 
Mongodb workshop cinlug
Daker Fernandes
 
Mini-Curso de MongoDB
Brunno Gomes
 
Node JS - Parte 2
Bruno Catão
 
Webinar: Arquitetura de software para sistemas embarcados
Embarcados
 
[Datafest 2018] Apache Spark Structured Stream - Moedor de dados em tempo qua...
Eiti Kimura
 
Desenvolvendo soluções com banco de dados não relacional - MongoDB
iMasters
 
PHPMyadmin - Introdução
Marco Pinheiro
 
Criando sua própria linguagem de programação
ronaldoferraz
 
Ruby & Rails
Sergio Henrique
 
pgModeler: muito mais que um modelador de bancos de dados PostgreSQL
Raphael Silva
 
Design Patterns para Tuning Pentaho com Ctools
e-Setorial
 
Dito Tech Talk RSpec
guest49d83b2
 
Anúncio

Mais de Felipe (18)

PDF
Aula rotulação automática - Automatic tagging
Felipe
 
PDF
First steps with Keras 2: A tutorial with Examples
Felipe
 
PDF
Word embeddings introdução, motivação e exemplos
Felipe
 
PDF
Cloud Certifications - Overview
Felipe
 
PDF
Elasticsearch for Data Analytics
Felipe
 
PDF
Cloudwatch: Monitoring your Services with Metrics and Alarms
Felipe
 
PDF
Cloudwatch: Monitoring your AWS services with Metrics and Alarms
Felipe
 
PDF
Online Machine Learning: introduction and examples
Felipe
 
PDF
Aws cost optimization: lessons learned, strategies, tips and tools
Felipe
 
PDF
Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...
Felipe
 
PDF
Boas práticas no desenvolvimento de software
Felipe
 
PDF
Rachinations
Felipe
 
PDF
Ausgewählte preußische Tugenden
Felipe
 
PDF
Short intro to scala and the play framework
Felipe
 
PDF
Conceitos e exemplos em versionamento de código
Felipe
 
PDF
DevOps Series: Extending vagrant with Puppet for configuration management
Felipe
 
PDF
DevOps Series: Defining and Sharing Testable Machine Configurations with vagrant
Felipe
 
PDF
D3.js 30-minute intro
Felipe
 
Aula rotulação automática - Automatic tagging
Felipe
 
First steps with Keras 2: A tutorial with Examples
Felipe
 
Word embeddings introdução, motivação e exemplos
Felipe
 
Cloud Certifications - Overview
Felipe
 
Elasticsearch for Data Analytics
Felipe
 
Cloudwatch: Monitoring your Services with Metrics and Alarms
Felipe
 
Cloudwatch: Monitoring your AWS services with Metrics and Alarms
Felipe
 
Online Machine Learning: introduction and examples
Felipe
 
Aws cost optimization: lessons learned, strategies, tips and tools
Felipe
 
Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...
Felipe
 
Boas práticas no desenvolvimento de software
Felipe
 
Rachinations
Felipe
 
Ausgewählte preußische Tugenden
Felipe
 
Short intro to scala and the play framework
Felipe
 
Conceitos e exemplos em versionamento de código
Felipe
 
DevOps Series: Extending vagrant with Puppet for configuration management
Felipe
 
DevOps Series: Defining and Sharing Testable Machine Configurations with vagrant
Felipe
 
D3.js 30-minute intro
Felipe
 
Anúncio

Pré processamento de grandes dados com Apache Spark

  • 1. Pré-processamento de Grandes Dados com Apache Spark Rio Big Data Meetup - Novembro 2015 Felipe Almeida ([email protected] | http://queirozf.com) https://github.com/queirozfcom/rio-big-data-meetup-nov-2015
  • 2. Estrutura da palestra ● Introdução ● O problema ● Spark ● Spark Dataframes ● Spark UDFs ● Spark ml ● Estudo de caso 2/28
  • 3. Introdução ● Tarefas de mineração de dados e aprendizado de máquina só são possíveis após uma etapa de pré-processamento. ● Pergunta: como pré-processar dados da ordem de muitos GB ou TB? ● Hadoop e Spark ● As versões recentes do Spark adicionaram recursos úteis para essas tarefas. 3/28
  • 4. O problema ● Vamos tratar especificamente do problema de extração de features ○ Isto é, transformar uma massa de dados em um conjunto de dados onde cada amostra é representada por um vetor de features 4/28
  • 5. Spark ● Framework para computação em cluster, feito em Scala. ● Nasceu para resolver dois problemas do Hadoop: ○ Necessidade de persistir em disco após cada job ○ Difícil utilização para tarefas interativas ● Abstração principal: RDD ○ Um dataset distribuído nos nós do cluster ● Suporta várias operações além das famosas map e reduce 5/28
  • 6. Spark 6/28 carrega um arquivo texto do HDFS cada linha é transformada em uma lista de palavras exemplo de programa Spark usando Python (wordcount) cada palavra é transformada em uma tupla (palavra,1) os pares com a mesma chave (i.e. mesma palavra) são agrupados e somados
  • 7. Spark DataFrames ● O módulo spark-sql adicionou o conceito de DataFrames ○ Como usado na linguagem R ou na biblioteca pandas (Python) ● Um DataFrame é comumente utilizado para representar um dataset: ○ Linhas representam cada amostra (ponto) ○ Colunas representam cada feature ● Também é um RDD ○ Do tipo RDD[sql.Row] ○ Suporta também todas as operações de RDD 7/28
  • 8. Spark DataFrames ● Esquema de um DataFrame NxD (N amostras, D features) 8/28 feature #1 feature #2 feature #3 ... feature #D amostra #1 ... amostra #2 ... amostra #3 ... ... ... ... ... ... ... amostra #N ...
  • 9. Spark DataFrames // dataframes moram neste módulo import org.apache.spark.sql._ // construindo um sqlcontext a partir do sparkcontext val sqlContext = new SQLContext(sc) // carregando dados do S3 (schema inferido automaticamente) val df = sqlContext.read.json("s3://path/to/dataset") // select from dataframe where overall > 4.0 df.where(df("overall") > 4.0) 9/28
  • 10. Spark DataFrames - transformações Exemplo: feature scaling (normalização de features) DataFrame original DataFrame modificado aplicação da transformação de normalização 10/28 feature #1 feature #2 amostra #1 2 400 amostra #2 4 200 amostra #3 6 400 feature #1 feature #2 amostra #1 0 1 amostra #2 0.5 0 amostra #3 1 1
  • 11. Spark DataFrames - transformações Exemplo: tokenização (separar texto em tokens) DataFrame original DataFrame modificado 11/28 feature #1 amostra #1 “olá mundo!!” amostra #2 “spark para grandes dados” amostra #3 “usando spark” aplicação da transformação de tokenização feature #1’ amostra #1 [“olá”, “mundo”] amostra #2 [“spark”, “para”, “grandes”, “dados”] amostra #3 [“usando”,”spark”]
  • 12. Spark UDFs ● UDFs: User-defined functions ○ São funções que atuam sobre uma coluna de um DataFrame ● Note a diferença com relações a funções como filter, map, reduce que atuam sobre uma linha de um DataFrame 12/28
  • 13. Spark UDFs ● UDFs podem ser usadas para criar colunas em um DataFrame: import org.apache.spark.sql.functions.udf // uma UDF que retorna o tamanho de uma string val len = udf { str:String => str.length } // aplicar a UDF len à coluna texto e criar uma // nova coluna com o resultado val df1 = df.withColumn("tamanho", len(df("texto")) 13/28
  • 14. Spark UDFs Resultado da aplicação da UDF len : DataFrame df DataFrame df1 14/28 texto amostra #1 “foo” amostra #2 “foo bar” amostra #3 “oi” aplicação da UDF len tamanho amostra #1 3 amostra #2 7 amostra #3 2
  • 15. Spark ml 15/28 ● spark.ml é um componente do módulo spark-mllib ● Disponibiliza, entre outras coisas, várias transformações baseadas em UDFs para manipular um DataFrame ● Entre elas: ○ RegexTokenizer ○ OneHotEncoder ○ StringIndexer ○ MinMaxScaler ○ Bucketizer
  • 16. Spark ml ● RegexTokenizer (String => Vector[String]) ○ Tokeniza strings usando uma regex como delimitador DataFrame df DataFrame df1 16/28 texto amostra #1 “foo,bar” amostra #2 “bar baz” amostra #3 “foo.bar.baz” aplicação do RegexTokenizer usando a regex /s+|,|./ como delimitador tokens amostra #1 [“foo”,”bar”] amostra #2 [“bar”,”baz”] amostra #3 [“foo”,”bar”,”baz”]
  • 17. Spark ml ● StringIndexer (String => Double) ○ Transforma valores únicos em índices numéricos DataFrame df DataFrame df1 17/28 feature #1 amostra #1 “amarelo” amostra #2 “azul” amostra #3 “verde” amostra #4 “amarelo” aplicação do StringIndexer feature #1 mod amostra #1 0.0 amostra #2 1.0 amostra #3 2.0 amostra #4 0.0
  • 18. Spark ml ● OneHotEncoder (Double => Vector[Double]) ○ Transforma índices de features em um domínio em um vetor one-hot DataFrame df DataFrame df1 18/28 aplicação do OneHotEncoder feature #1 amostra #1 0.0 amostra #2 1.0 amostra #3 2.0 amostra #4 0.0 feature #1 mod amostra #1 [1.0,0.0,0.0] amostra #2 [0.0,1.0,0.0] amostra #3 [0.0,0.0,1.0] amostra #4 [1.0,0.0,0.0]
  • 19. Spark ml ● MinMaxScaler (Vector[Double] => Vector[Double]) ○ Normaliza os valores de uma coluna para o range [0,1] DataFrame df DataFrame df1 19/28 aplicação do MinMaxScaler feature #1 amostra #1 [2.0,800] amostra #2 [4.0,1200] amostra #3 [8.0,600] amostra #4 [16.0,200] feature #1 amostra #1 [0.0,0.6] amostra #2 [0.14,1.0] amostra #3 [0.43,0.4] amostra #4 [1.0,0.0]
  • 20. Spark ml ● Bucketizer (Double => Double) ○ Discretiza features contínuas, usando limites DataFrame df DataFrame df1 20/28 aplicação do Bucketizer usando os limites 100, 200, 500, 2000 e 5000 feature #1 amostra #1 329.23 amostra #2 123.38 amostra #3 3289.57 amostra #4 1982.376 feature #1’ amostra #1 1.0 amostra #2 0.0 amostra #3 3.0 amostra #4 2.0
  • 21. Estudo de caso: Reviews Amazon ● Um estudo de caso mostrando várias etapas possíveis para um dataset real ● Não é um processo completo, apenas alguns passos para motivar os ouvintes e dar uma ideia das quantidades envolvidas ○ Usa UDFs e também o módulo spark-mllib ● Código completo em https://github.com/queirozfcom/rio-big-data- meetup-nov-2015 ○ Incluindo a criação dos clusters usando AWS EMR 21/28
  • 22. O dataset Cada elemento é uma review de um produto na Amazon.com ● ~ 55 Gb (após desempacotamento) ● ~ 82 Milhões de Reviews ● Maio/1996 - Julho/2014 ● Formato Json ● Link: http://jmcauley.ucsd.edu/data/amazon/ 22/28
  • 23. O dataset ● Elemento de exemplo: { "reviewerID": "A2SUAM", "asin": "00000", "reviewerName": "J. McDonald", "helpful": [2, 3], "reviewText": "I bought this for ...", "overall": 5.0, "summary": "Heavenly Highway!", "unixReviewTime": 1252800000 } 23/28
  • 24. Passos do Pipeline de exemplo 1. Retirar linhas com elementos null 2. Adicionar features para: a. O tamanho do texto do reviewText e do summary b. Período do dia em que a review for feita (dia/noite) c. Período da semana em que a review foi feita (dia útil/fim de semana) 3. Juntar todo o texto corrido (reviewText + summary) em um único campo, passar para minúsculas, tokenizar e transformar em um vetor de frequências (TF) 4. Normalizar a nota (atributo overall) 5. Transformar o atributo helpful em um float e normalizar 24/28
  • 25. Dicas Gerais / Lições aprendidas ● É melhor criar uma máquina EC2, baixar o dataset para ela e, de lá, fazer upload para o S3 ○ Se estiverem na mesma área, o processo é muito mais rápido ● Se usar AWS EMR, cuidado para não esquecer o cluster ligado! ○ Use --auto-terminate ● Habilitar dynamicAllocation ● Recomendo a API Scala pois as outras às vezes ficam defasadas 25/28
  • 26. Mais informações ● Todo o código foi rodado no ambiente da AWS, usando o serviço EMR (Elastic MapReduce), com o build emr-4.0.1 ○ Todo o código usado pode ser obtido em https://github. com/queirozfcom/rio-big-data-meetup-nov-2015 ● Guia para criar um cluster Spark usando o serviço AWS Elastic MapReduce (EMR) ● Guia para usar o Apache Zeppelin no AWS EMR ● Guia para criar UDFs (User-defined Functions) no Spark/pyspark 26/28
  • 28. Agradecimentos ● Professor Alexandre Assis DSc. (orientador do trabalho original) ○ PESC/COPPE UFRJ ● Rosângela Oliveira (colega no trabalho original) ○ [email protected] ● Julian McAuley PhD. (fornecimento do dataset) 28/28