Spark中两个DataFrame的逐行聚合

时间:2017-02-17 07:02:48

标签: python apache-spark pyspark

我有两个数据帧df_A& df_B其中df_B中的列是df_A中列的子集。除了一个唯一标识符列之外,其余所有列都是LongType。我试图实现的是使用uuid逐行聚合B& B中存在的列。 A保持A的列完整。

df_A.schema
# StructType(List(StructField(custom_uuid,StringType,true),
  StructField(custom_col1,LongType,true),
  StructField(custom_col2,LongType,true),
  StructField(custom_col3,LongType,true),
  StructField(custom_col4,LongType,true)))
df_B.schema
# StructType(List(StructField(custom_uuid,StringType,true),
  StructField(custom_col1,LongType,true),
  StructField(custom_col2,LongType,true),
  StructField(custom_col3,LongType,true)))

我无法找到解决此问题的直接解决方案,并且我可以通过首先向B添加缺失列并使用联盟来使用数据帧上的联合。

for missing_column in missing_columns: # 100-200 missing columns
    df_B = df_B.withColumn(missing_column,lit(None).cast(LongType()))
df_final = df_A.union(df_B)

然后在最终数据集上,我基于uuid进行聚合以获得结果。

col_sums = [sparkSum(col(col_name)) for col_name in df_final.schema.names]
aggregated_df = df_final
    .groupBy("custom_uuid")
    .agg(*col_sums)

但这似乎是解决问题的漫长方法,因为它涉及按顺序执行的步骤:

  • 将缺少的列附加到子集Dataframe
  • 结合数据帧
  • 参加工会后聚合

是否有其他方法可以提高聚合效率? df_A和df_B之间可能存在100-200列的差异。此外,df_B中的行可能低于df_A中的行(最小行= 20百万)。或者除了使用spark之外还有一些其他有效的方法(例如:orderby(uuid)在数据帧上并使用其他东西进行任务)。

0 个答案:

没有答案