SlideShare uma empresa Scribd logo
1 de 28
Baixar para ler offline
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

Administração de Sistemas de Informação - aula 3
Administração de Sistemas de Informação - aula 3Administração de Sistemas de Informação - aula 3
Administração de Sistemas de Informação - aula 3
Paulo Sérgio Ramão
 

Mais procurados (20)

Big Data, o que é isso?
Big Data, o que é isso?Big Data, o que é isso?
Big Data, o que é isso?
 
Estrutura de Dados - Conceitos fundamentais
Estrutura de Dados - Conceitos fundamentaisEstrutura de Dados - Conceitos fundamentais
Estrutura de Dados - Conceitos fundamentais
 
Big Data - Conceitos Básicos
Big Data - Conceitos BásicosBig Data - Conceitos Básicos
Big Data - Conceitos Básicos
 
Ciência de Dados: a revolução na tomada de decisões
Ciência de Dados: a revolução na tomada de decisõesCiência de Dados: a revolução na tomada de decisões
Ciência de Dados: a revolução na tomada de decisões
 
Banco de Dados II Aula 11 - Gerenciamento de transação (transações - fundamen...
Banco de Dados II Aula 11 - Gerenciamento de transação (transações - fundamen...Banco de Dados II Aula 11 - Gerenciamento de transação (transações - fundamen...
Banco de Dados II Aula 11 - Gerenciamento de transação (transações - fundamen...
 
Padrões MVC
Padrões MVCPadrões MVC
Padrões MVC
 
Curso de Desenvolvimento Web - Módulo 03 - JavaScript
Curso de Desenvolvimento Web - Módulo 03 - JavaScriptCurso de Desenvolvimento Web - Módulo 03 - JavaScript
Curso de Desenvolvimento Web - Módulo 03 - JavaScript
 
Aula 02 - Escolha caso
Aula 02 - Escolha casoAula 02 - Escolha caso
Aula 02 - Escolha caso
 
Banco de Dados II Aula 07 - Linguagem de Consulta SQL (Comandos DDL)
Banco de Dados II Aula 07 - Linguagem de Consulta SQL (Comandos DDL)Banco de Dados II Aula 07 - Linguagem de Consulta SQL (Comandos DDL)
Banco de Dados II Aula 07 - Linguagem de Consulta SQL (Comandos DDL)
 
Ciência de Dados: a revolução na tomada de decisões
Ciência de Dados: a revolução na tomada de decisõesCiência de Dados: a revolução na tomada de decisões
Ciência de Dados: a revolução na tomada de decisões
 
Big data
Big dataBig data
Big data
 
Banco de dados - Aula 1 SQL
Banco de dados - Aula 1 SQLBanco de dados - Aula 1 SQL
Banco de dados - Aula 1 SQL
 
Aula 02 - Introdução ao PHP
Aula 02 - Introdução ao PHPAula 02 - Introdução ao PHP
Aula 02 - Introdução ao PHP
 
Python - Introdução
Python - IntroduçãoPython - Introdução
Python - Introdução
 
Criação de tabelas com HTML
Criação de tabelas com HTMLCriação de tabelas com HTML
Criação de tabelas com HTML
 
Definição e classificação dos requisitos
Definição e classificação dos requisitosDefinição e classificação dos requisitos
Definição e classificação dos requisitos
 
Administração de Sistemas de Informação - aula 3
Administração de Sistemas de Informação - aula 3Administração de Sistemas de Informação - aula 3
Administração de Sistemas de Informação - aula 3
 
Aula 1 - Introdução a POO
Aula 1 -  Introdução a POOAula 1 -  Introdução a POO
Aula 1 - Introdução a POO
 
MC - Aula 05 - Memória e Dispositivos de Armazenamento
MC - Aula 05 - Memória e Dispositivos de ArmazenamentoMC - Aula 05 - Memória e Dispositivos de Armazenamento
MC - Aula 05 - Memória e Dispositivos de Armazenamento
 
Banco de Dados II Aula 04 - MODELAGEM DE DADOS (Generalização e Especialização)
Banco de Dados II Aula 04 - MODELAGEM DE DADOS (Generalização e Especialização)Banco de Dados II Aula 04 - MODELAGEM DE DADOS (Generalização e Especialização)
Banco de Dados II Aula 04 - MODELAGEM DE DADOS (Generalização e Especialização)
 

Semelhante a Pré processamento de grandes dados com Apache Spark

[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...
[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...
[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...
Marcio Machado Pereira
 
PHPMyadmin - Introdução
PHPMyadmin - IntroduçãoPHPMyadmin - Introdução
PHPMyadmin - Introdução
Marco Pinheiro
 

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

Exemplos de uso de apache spark usando aws elastic map reduce
Exemplos de uso de apache spark usando aws elastic map reduceExemplos de uso de apache spark usando aws elastic map reduce
Exemplos de uso de apache spark usando aws elastic map reduce
 
Palestra cbq
Palestra cbqPalestra cbq
Palestra cbq
 
[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...
[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...
[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...
 
Utilizando NoSQL no desenvolvimento de soluções inteligentes
Utilizando NoSQL no desenvolvimento de soluções inteligentesUtilizando NoSQL no desenvolvimento de soluções inteligentes
Utilizando NoSQL no desenvolvimento de soluções inteligentes
 
Aula c++ estruturas de dados
Aula c++   estruturas de dadosAula c++   estruturas de dados
Aula c++ estruturas de dados
 
Introdução Ruby 1.8.7 + Rails 3
Introdução Ruby 1.8.7 + Rails 3Introdução Ruby 1.8.7 + Rails 3
Introdução Ruby 1.8.7 + Rails 3
 
Oficial
OficialOficial
Oficial
 
Mongodb workshop cinlug
Mongodb workshop cinlugMongodb workshop cinlug
Mongodb workshop cinlug
 
Mini-Curso de MongoDB
Mini-Curso de MongoDBMini-Curso de MongoDB
Mini-Curso de MongoDB
 
Node JS - Parte 2
Node JS - Parte 2Node JS - Parte 2
Node JS - Parte 2
 
Webinar: Arquitetura de software para sistemas embarcados
Webinar: Arquitetura de software para sistemas embarcadosWebinar: Arquitetura de software para sistemas embarcados
Webinar: Arquitetura de software para sistemas embarcados
 
[Datafest 2018] Apache Spark Structured Stream - Moedor de dados em tempo qua...
[Datafest 2018] Apache Spark Structured Stream - Moedor de dados em tempo qua...[Datafest 2018] Apache Spark Structured Stream - Moedor de dados em tempo qua...
[Datafest 2018] Apache Spark Structured Stream - Moedor de dados em tempo qua...
 
Desenvolvendo soluções com banco de dados não relacional - MongoDB
Desenvolvendo soluções com banco de dados não relacional - MongoDBDesenvolvendo soluções com banco de dados não relacional - MongoDB
Desenvolvendo soluções com banco de dados não relacional - MongoDB
 
PHPMyadmin - Introdução
PHPMyadmin - IntroduçãoPHPMyadmin - Introdução
PHPMyadmin - Introdução
 
Criando sua própria linguagem de programação
Criando sua própria linguagem de programaçãoCriando sua própria linguagem de programação
Criando sua própria linguagem de programação
 
Ruby & Rails
Ruby & RailsRuby & Rails
Ruby & Rails
 
pgModeler: muito mais que um modelador de bancos de dados PostgreSQL
pgModeler: muito mais que um modelador de bancos de dados PostgreSQLpgModeler: muito mais que um modelador de bancos de dados PostgreSQL
pgModeler: muito mais que um modelador de bancos de dados PostgreSQL
 
Design Patterns para Tuning Pentaho com Ctools
Design Patterns para Tuning Pentaho com CtoolsDesign Patterns para Tuning Pentaho com Ctools
Design Patterns para Tuning Pentaho com Ctools
 
Dito Tech Talk RSpec
Dito Tech Talk RSpecDito Tech Talk RSpec
Dito Tech Talk RSpec
 
Django + extjs pelos forms
Django + extjs pelos formsDjango + extjs pelos forms
Django + extjs pelos forms
 

Mais de Felipe

Mais de Felipe (18)

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

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 (falmeida1988@gmail.com | 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) ○ rmsilva@cos.ufrj.br ● Julian McAuley PhD. (fornecimento do dataset) 28/28