Spark unionTutti i dataframmi multipli

Per un set di dataframe

val df1 = sc.parallelize(1 to 4).map(i => (i,i*10)).toDF("id","x") val df2 = sc.parallelize(1 to 4).map(i => (i,i*100)).toDF("id","y") val df3 = sc.parallelize(1 to 4).map(i => (i,i*1000)).toDF("id","z") 

ad unione tutti loro lo faccio

 df1.unionAll(df2).unionAll(df3) 

Esiste un modo più elegante e scalabile per fare questo per qualsiasi numero di dataframe, ad esempio da

 Seq(df1, df2, df3) 

La soluzione più semplice è reduce con union ( unionAll in Spark <2.0):

 val dfs = Seq(df1, df2, df3) dfs.reduce(_ union _) 

Questo è relativamente conciso e non dovrebbe spostare i dati da una memoria fuori dallo heap, ma estende il lignaggio con ogni unione richiede un tempo non lineare per eseguire l’analisi del piano. quale può essere un problema se si tenta di unire un numero elevato di DataFrames .

Puoi anche convertire in RDDs e usare SparkContext.union :

 dfs match { case h :: Nil => Some(h) case h :: _ => Some(h.sqlContext.createDataFrame( h.sqlContext.sparkContext.union(dfs.map(_.rdd)), h.schema )) case Nil => None } 

Mantiene bassi i costi dell’analisi della discendenza , ma altrimenti è meno efficiente di unire direttamente DataFrames .

Per pyspark puoi fare quanto segue:

 from functools import reduce from pyspark.sql import DataFrame dfs = [df1,df2,df3] df = reduce(DataFrame.unionAll, dfs)