如何在Python中结合Spark SQL Dataframes

时间:2017-08-07 16:21:33

标签: python pyspark spark-dataframe

以下是创建数据帧联合的几种方法,当我们讨论大数据帧时,哪些(如果有的话)是最佳/推荐的?我应该首先创建一个空数据帧还是连续地创建第一个创建的数据帧?

空数据框创建

from pyspark.sql.types import StructType, StructField, IntegerType, StringType

schema = StructType([
    StructField("A", StringType(), False), 
    StructField("B", StringType(), False), 
    StructField("C", StringType(), False)
])

pred_union_df = spark_context.parallelize([]).toDF(schema)

方法1 - 随时联盟:

for ind in indications:
    fitted_model = get_fitted_model(pipeline, train_balanced_df, ind)
    pred = get_predictions(fitted_model, pred_output_df, ind)
    pred_union_df  = pred_union_df.union(pred[['A', 'B', 'C']])

方法2 - 最后的联盟:

all_pred = []
for ind in indications:
    fitted_model = get_fitted_model(pipeline, train_balanced_df, ind)
    pred = get_predictions(fitted_model, pred_output_df, ind)
    all_pred.append(pred)
pred_union_df = pred_union_df.union(all_pred)

或者我错了吗?

修改 方法2是不可能的,因为我认为它来自这个answer。我不得不遍历列表并联合每个数据帧。

1 个答案:

答案 0 :(得分:1)

方法2总是首选,因为它避免了长谱系问题。

虽然DataFrame.union只需要一个DataFrame作为参数,但RDD.uniontake a list。根据您的示例代码,您可以在调用toDF之前尝试将它们联合起来。

如果您的数据在磁盘上,您也可以尝试load them all at once来实现联合,例如,

dataframe = spark.read.csv([path1, path2, path3])