如何在 Python 中合并 Spark SQL 数据帧

Posted

技术标签:

【中文标题】如何在 Python 中合并 Spark SQL 数据帧【英文标题】:How to union Spark SQL Dataframes in Python 【发布时间】:2017-08-07 16:21:33 【问题描述】:

这里有几种创建数据框联合的方法,当我们谈论大数据框时,哪种方法(如果有的话)最好/推荐?我应该先创建一个空数据框还是继续与创建的第一个数据框联合?

空数据框创建

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】:

方法 2 始终是首选,因为它避免了长沿袭问题。

虽然DataFrame.union 只接受一个DataFrame 作为参数,但RDD.union 却是take a list。鉴于您的示例代码,您可以在调用 toDF 之前尝试合并它们。

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

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

【讨论】:

以上是关于如何在 Python 中合并 Spark SQL 数据帧的主要内容,如果未能解决你的问题,请参考以下文章

合并 Spark SQL - 当源不匹配时

在 Spark 中合并多行

如何在 SparkSQL 中合并小文件? [复制]

spark 实现大表数据合并

Spark in Python Working with Tuples - 如何在加入两个 RDD 后合并两个元组

Spark SQL 合并查询