PySpark
Produtividade e poder de processamento
Quem?
github.com/felipecruz

@felipejcruz


Agenda
- Map-Reduce
- Pyspark
Maior oferta feita em uma semana na BOVESPA?
Motivação


highest_offer = max(offers)






































































































































?
















































?


















































highest_offers_1 = max(offers_partition1)highest_offers_2 = max(offers_partition2)

















































highest_offers_1 = max(offers_partition1)highest_offers_2 = max(offers_partition2)max(highest_offers_1, highest_offers_2)calma...

Map

Map

Reduce
Map-Reduce
não é divisão e conquista (que pode ser implementada com map-reduce)
Aplicações
- Filtragem
- Distintos
- Top K
- Por valor
- Sumarização
- Índice invertido
- Contagem de palavras
- Estruturação
- Ordenação
- Particionamento
- Embaralhamento
- Join
- Inner join
- Produto cartesiano
nosso exemplo K = 1
PySpark
Funcionalidades centrais
- Map-Reduce
-
RDD, DataFrames & SQL - MLlib
- Streaming
- GraphX
Map & Reduce
>>> prices = sc.textFile('s3n://prognoos-pyspark/*.gz') \
... .filter(lambda x: x.count(';') > 14) \
... .map(lambda x: [s.strip() for s in x.split(';')]) \
... .map(lambda x: (x[1], x[8], x[15]))
...
>>> prices.take(2)
[(u'ABEVA70', u'000000000000.350000', u'000000000000008300'),
(u'ABEVA70', u'000000000000.350000', u'000000000000007100')]
Map & Reduce
>>> prices = sc.textFile('ftp://*.gz') \
... .filter(lambda x: x.count(';') > 14) \
... .map(lambda x: [s.strip() for s in x.split(';')]) \
... .map(lambda x: (x[1], float(x[8]), x[15]))
...
>>> sum_all = prices.map(lambda x: x[2])\
... .reduce(lambda x, y: x + y)
...
>>> sum_all
1532623750.0
from datetime import datetime
strpt = lambda x: datetime.strptime(x, '%H:%M:%S.%f')
f = float
negs = sc.textFile('s3n://prognoos-pyspark/NEG/*.gz') \
.filter(lambda x: x.count(';') > 14) \
.map(lambda x: [s.strip() for s in x.split(';')]) \
.map(lambda x: (strpt(x[5]), 'NEG', x[1], f(x[3]), f(x[16]), x[17]))
buys = sc.textFile('s3n://prognoos-pyspark/CPA/*.gz') \
.filter(lambda x: x.count(';') > 14) \
.map(lambda x: [s.strip() for s in x.split(';')]) \
.map(lambda x: (strpt(x[6]), 'CPA', x[1], f(x[8]), x[15], None))
sell = sc.textFile('s3n://prognoos-pyspark/VDA/*.gz') \
.filter(lambda x: x.count(';') > 14) \
.map(lambda x: [s.strip() for s in x.split(';')]) \
.map(lambda x: (strpt(x[6]), 'VDA', x[1], f(x[8]), None, x[15]))
all_operations = negs.union(buys).union(sell)
total = all_operations.count() # total = 52980676
... nem tudo são flores
data = sc.parallelize(['aa', 'bb', 'ab', 'bc'])
def _filter(data):
sts = ['a', 'b']
rets = []
for st in sts:
rets.append((st,
data.filter(lambda x: x.startswith(st))))
return rets
rdds = _filter(data)
for st, rdd in rdds:
print((st, rdd.collect()))
# ('a', ['bb', 'bc'])
# ('b', ['bb', 'bc'])Python - Anti-pattern - não faça!!
DataFrames & SQL
DataFrame
A distributed collection of data grouped into named columns
http://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.DataFrame
events = negs.union(buys).union(sell).toDF()
# API de DataFrame
total = events.count()
# Salva pra uso posterior
events.write.save('s3n://prognoos/events/',
format='parquet',
mode='Overwrite')SparkSQL
http://spark.apache.org/docs/latest/api/python/pyspark.sql.html
>>> path = 's3n://prognoos-test/events'
>>> table_name = 'bovespa_events'
>>> events = sqlContext.read.parquet(path)
>>> events.registerTempTable(table_name)
>>> total_events = sqlContext.sql('''
select count(*) from bovespa_events
''')
Spark em produção
- Standalone
- Hadoop/Yarn
- Mesos
Spark em produção


Dúvidas?
@felipejcruz
github.com/felipecruz
PySpark
By Felipe Cruz
PySpark
- 792