8

Для набора dataframesСпарк unionAll множественные dataframes

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") 

для объединения всех из них я

df1.unionAll(df2).unionAll(df3) 

Есть ли более элегантный и масштабируемой способ сделать это для любого числа dataframes, например от

Seq(df1, df2, df3) 

ответ

19

Самое простое решение состоит в reduce с union (unionAll в Спарке < 2.0):

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

Это относительно краткое и не должен переместить данные из кучи не совсем хранения , но расширяет линию с каждым союзом требует нелинейного времени для выполнения анализа плана. что может быть проблемой, если вы попытаетесь объединить большое количество DataFrames.

Вы также можете конвертировать в RDDs и использовать 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 
} 

Он держит родословную короткую стоимость анализа низкими, но в остальном он менее эффективен, чем слияние DataFrames непосредственно.

+1

Спасибо за все эти подходы! – echo

+0

Это просто в scala? Что бы это могло быть ? –

Смежные вопросы