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).
In [19]:
from random import *
from math import sqrt
inside=0
n=1000
for i in range(0,n):
x=random()
y=random()
if sqrt(x*x+y*y)<=1:
inside+=1
pi=4*inside/n
print(pi)
In [26]:
from random import *
from math import sqrt
def soma(a,b): return a+b
def area(x,y):return 1 if sqrt(x*x+y*y)<=1 else 0
def mapfunction(z):
x=random()
y=random()
return area(x,y)
In [27]:
nummin = sc.defaultMinPartitions * 10000
data = sc.parallelize(range(1, nummin))
res1 = data.map(mapfunction)
In [28]:
print(res1.reduce(soma))
In [30]:
pispark = 4*(res1.reduce(soma))/(res1.count())
print(pispark)
In [1]:
def primes( n ):
# i sera nosso divisor inicial
i = 1;
# j sera nosso contador de ocorrências
j = 0;
#Nenhum numero real vai ser divisivel por um numero maior do que sua metade
n1 = (n/2);
while (i <= n):
if (n % i==0):
i = i+1;
j = j+1;
if (i>=n1):
# damos a i, o valor da variavel entrada, pois o próximo divisor sera o próprio número
i = n;
i = i+1;
j = j+1;
else:
i = i+1;
if(j==2):
return True
else:
return False
In [2]:
data = sc.parallelize(range(1, 1000000))
res = data.filter(primes)
print(res.take(100))
In [1]:
def mapfun(x):
return [x[0],x[1]]
In [2]:
lines = sc.textFile("municipios_do_Brasil.csv")
data = lines.map(lambda line: line.split(",")).map(mapfun)
print(data.take(10))
In [3]:
data.sortByKey()
print(data.take(20))
In [4]:
Counts = data.groupByKey().map(lambda x : (x[0], list(x[1])))
print(Counts.take(1))
In [7]:
new = Counts.map(lambda tup: (tup[0], len(tup[1])))
print(new.take(4))
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!
In [10]:
def filterfun(w):
stopwords = set(open('stopwords.pt').read().split())
if w[0] in stopwords:
return False
else:
return True
In [15]:
text_file = sc.textFile("Machado-de-Assis-Memorias-Postumas.txt")
counts = text_file.flatMap(lambda line: line.split(" ")) \
.map(lambda word: (word, 1)) \
.reduceByKey(lambda a, b: a + b)
counts = counts.filter(filterfun)
counts = counts.takeOrdered(100, key = lambda x: -x[1])
In [16]:
print(counts)
É dificil deduzir sobre o que o livro baseado apenas nas suas palavras. As palavras nos permitem deduzir que se trata de um livro(a palavra capítulo aparece no top 10), podemos também deduzir o nome de alguns personagens importantes como Quincas, Virgília, Brás e Marcela