2017-08-11 2 views
0

J'essaie de créer un filtre bloom pour un grand nombre de chaînes à partir d'une base de données - ~ 120 millions. Avec une moyenne de 20-25 caractères par chaîne, la taille totale des données dépasse la valeur par défaut de spark.driver.maxResultSize de 1 Go. Je ne veux pas changer le maxResultSize puisque je vais devoir le changer encore quand la taille des données d'entrée augmente à l'avenir.Formation d'un filtre BloomFilter sur Spark avec un grand ensemble de données

Y a-t-il un moyen dans Spark que je puisse streamer les données à partir de la dataframe en petits morceaux et former le BloomFilter en appelant BloomFilter.putString()? J'ai également essayé d'utiliser Dataset.toLocalIterator() mais en raison de la nature de l'ensemble de données source, j'ai dû le fusionner en 100 grandes partitions, rendant chacune de ces 100 partitions trop grandes pour tenir dans la mémoire du pilote. En dernier recours, je pense à rassembler les données dans un fichier HDFS et à les lire avec un DFSInputStream, mais je veux l'éviter s'il y a quelque chose dans Spark.

Répondre

1

Spark DataFrameStatFunctions fournir bloomFilter mise en œuvre:

val df = Seq(1, 3, 7, 21).toDF("id") 
val bf = df.stat.bloomFilter("id", expectedNumItems=1000, fpp=0.001) 
scala> bf.mightContain(1) 
res1: Boolean = true 

scala> bf.mightContain(4) 
res2: Boolean = false 
+0

pls comprennent l'instruction 'dans votre extrait importation, on – javadba