我有两个数据帧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)
但这似乎是解决问题的漫长方法,因为它涉及按顺序执行的步骤:
是否有其他方法可以提高聚合效率? df_A和df_B之间可能存在100-200列的差异。此外,df_B中的行可能低于df_A中的行(最小行= 20百万)。或者除了使用spark之外还有一些其他有效的方法(例如:orderby(uuid)在数据帧上并使用其他东西进行任务)。