<jupyter_start><jupyter_text>Data Science Academy Big Data Real-Time Analytics com Python e Spark Capítulo 7  *********** Atenção: *********** Utilize Java JDK 11 e Apache Spark 2.4.2 *Caso receba mensagem de erro "name 'sc' is not defined", interrompa o pyspark e apague o diretório metastore_db no mesmo diretório onde está este Jupyter notebook*  Introdução ao PySpark<jupyter_code>import sys
print(sys.version)
print(sc)
print(sc.version)
# Testando o Spark e criando uma RDD
lst = [25, 90, 81, 37, 776, 3320]
testData = sc.parallelize(lst)
?sc.parallelize
type(testData)
testData.count()
testData.collect()<jupyter_output><empty_output><jupyter_text>Executando Aplicação PySpark RDD's são coleções distribuídas de itens. RDD's podem ser criadas a partir do Hadoop (arquivos no HDFS), através da transformação de outras RDD's, a partir de bancos de dados (relacionais e não-relacionais) ou a partir de arquivos locais.<jupyter_code># Criando uma RDD a partir de um arquivo csv
sentimentoRDD = sc.textFile("data/sentimentos.csv")
type(sentimentoRDD)
# Ação - Contando o número de registros
sentimentoRDD.count()
# Listando os 5 primeiros registros
sentimentoRDD.take(5)
# Transformando os dados - transformação para letras maiúsculas
transfRDD = sentimentoRDD.map(lambda x : x.upper())
transfRDD.take(5)
sentimentoRDD.take(5)
arquivo = sc.textFile("data/sentimentos.csv")
type(arquivo)
arquivo.count()
arquivo.first()
linhasComSol = arquivo.filter(lambda line: "Sol" in line)
type(linhasComSol)
linhasComSol.count()<jupyter_output><empty_output><jupyter_text>Primeiro a função map() determina o comprimento de cada linha do arquivo, criando uma RDD. A função reduce() é chamada para encontrar a linha com maior número de caracteres. O argumento para as funções map() e reduce() são funções anônimas criadas com lambda (da linguagem Python).<jupyter_code>arquivo.map(lambda line: len(line.split())).reduce(lambda a, b: a if (a > b) else b)<jupyter_output><empty_output><jupyter_text>Esta linha pode ser reescrita da seguinte forma:<jupyter_code>def max(a, b):
    if a > b:
        return a
    else:
        return b

arquivo.map(lambda line: len(line.split())).reduce(max)<jupyter_output><empty_output><jupyter_text>Operação de MapReduce As operações de MapReduce foram popularizadas pelo Hadoop e podem ser feitas com Spark até 100x mais rápido.<jupyter_code>contaPalavras = arquivo.flatMap(lambda line: line.split()).map(lambda palavra: (palavra, 1)).reduceByKey(lambda a, b: a+b)
contaPalavras.collect()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1015748031496063, 'fraction_numerical': 0.01141732283464567, 'mean_word_length': 6.038781163434903, 'pattern_counts': {'":': 0, '<': 21, '<?xml version=': 0, '>': 23, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '5', 'dir': 'jupyter-structured-clean-dedup', 'id': '411756', 'license': 'MIT', 'n_tokens_mistral': 937, 'n_tokens_neox': 902, 'n_words': 271, 'path': 'Apache Spark/02-Cap07-Introducao-PySpark.ipynb', 'repo_name': 'marxcerqueira/Spark-Real-Time-Analytics', 'size': '2540'}