from math import sqrt
from random import *

def area(x,y):return 1 if sqrt(x*x+y*y)<=1 else  0

def mapf(z):
    x= random()
    y=random()
    return area(x, y)

n = sc.defaultMinPartitions * 100000
data = sc.parallelize(range(1, n))

r = data.map(mapf)

soma = r.reduce(lambda a, b: a+b)
print(soma)
print(r.count())

soma = int(soma)

pi = 4*(soma/(r.count()))
print(pi)

"""
Explanation: Hands-on!
Nessa prática, sugerimos alguns pequenos exemplos para você implementar sobre o Spark.
Estimar o Pi
Existe um algoritmo para estimar o Pi com números radômicos. Implemente-o sobre o Spark.
Descrição do algoritmo: http://www.eveandersson.com/pi/monte-carlo-circle
Implementação EM PYTHON (não sobre o SPARK): http://www.stealthcopter.com/blog/2009/09/python-calculating-pi-using-random-numbers/
O númer de pontos deve ser 100000 (cem mill) vezes o número mínimo de partições padrão do seu SparkContext (sc.defaultMinPartitions). Esses pontos devem ser selecionados aleatóriamente na etapa de map (ver observações).
Observações: use as funções map (para mapear as ocorrêncas em 0 ou 1, significando 1 quando o ponto aleatório cair dentro do círculo e 0 quando o contrário) e reduce (para sumar as ocorrências).
End of explanation
"""


def isPrime(number):
    for i in range(1,number):
        if((i != 1) and (i != number)):
            if ((number % i) == 0):
                return False
    print(number)
    return True

data = sc.parallelize(range(1, 1000000))

r = data.filter(isPrime)

print(r.take(100))

"""
Explanation: Filtragem de Primos
Dado uma sequência de números de 1 a 1000000, filtre somente os primos dessa sequência.
End of explanation
"""


file = sc.textFile('municipios_do_Brasil.csv')

file_mapping = file.map(lambda line: line.split(',')).map(lambda word: (word[0], word[1]))

#Contando o numero de municipios por Estado
count_cities = file_mapping.map(lambda word: (word[0], 1)).reduceByKey(lambda x, y: x + y)

print(count_cities.collect())

#Listando os municipios por Estado
list_cities = file_mapping.groupByKey().map(lambda x : (x[0], list(x[1])))

print(list_cities.take(1))

"""
Explanation: Municípios do Brasil
Dado o dataset mucipios_do_Brasil.csv, faça duas operações com ele:

Monte uma lista dos municípios por estado.
Conte quantos municípios há em cada estado.

Dicas: use as operações groupByKey e reduceByKey, não faça um count na lista da operação 1.
End of explanation
"""


file2 = sc.textFile('Machado-de-Assis-Memorias-Postumas.txt')

stopwords = sc.textFile('stopwords.pt')
stopwords = stopwords.flatMap(lambda word: word.split())
stopwords = stopwords.collect()

stopwords

def filter_words(word):
    print(word[0])
    if word[0] in stopwords:
        return False
    return True

counts = file2.flatMap(lambda line: line.split(" ")).map(lambda word: word.lower()).map(lambda word: (word, 1)).reduceByKey(lambda a, b: a + b)
counts = counts.filter(filter_words)
counts = counts.takeOrdered(100, key = lambda x: -x[1])

print(counts)

"""
Explanation: Word Count Memória Postumas de Brás Cubas
Memórias Póstumas de Brás Cubas é um romance escrito por Machado de Assis, desenvolvido em princípio como folhetim, de março a dezembro de 1880, na Revista Brasileira, para, no ano seguinte, ser publicado como livro, pela então Tipografia Nacional.
A obra retrata a escravidão, as classes sociais, o cientificismo e o positivismo da época. Dada essas informações, será que conseguimos idenficar essas características pelas palavras mais utilizadas em sua obra?
Utilizando o dataset Machado-de-Assis-Memorias-Postumas.txt, faça um word count e encontre as palavras mais utilizadas por Machado de Assis em sua obra. Não esqueça de utilizar stopwords.pt para remover as stop words!
End of explanation
"""


