如何在单Spark会话中基于含重复列的Pandas DataFrame创建Spark DataFrame
解决方法
情况1:临时视图名称冲突
如果是你把df_cbm转成Spark DF后注册了临时视图,转df_sku时想用同名视图导致报错,直接给df_sku的Spark DF注册不同视图名即可:
# 转换df_cbm并注册视图 df_cbm_spark = spark.createDataFrame(df_cbm) df_cbm_spark.createTempView("cbm_data") # 转换df_sku时用新的视图名 df_sku_spark = spark.createDataFrame(df_sku) df_sku_spark.createTempView("sku_data") # 用不同名称规避冲突
情况2:df_sku含重复列名(或与df_cbm列名重复触发Spark校验报错)
Spark不允许DataFrame存在重复列名,但Pandas支持。可以先给重复列加临时标识,转成Spark DF后再改回原列名,最终列名保持不变:
# 给df_sku的重复列添加临时后缀 col_counts = {} new_cols = [] for col in df_sku.columns: if col in col_counts: col_counts[col] += 1 new_cols.append(f"{col}_tmp_{col_counts[col]}") else: col_counts[col] = 0 new_cols.append(col) # 复制df_sku并替换临时列名 df_sku_temp = df_sku.copy() df_sku_temp.columns = new_cols # 转换为Spark DF df_sku_spark = spark.createDataFrame(df_sku_temp) # 改回原始列名 df_sku_spark = df_sku_spark.toDF(*df_sku.columns)
后续关联两个DF时,可用别名区分重复列:
result = df_cbm_spark.alias("cbm") \ .join(df_sku_spark.alias("sku"), on="共享列名", how="inner") \ .select("cbm.重复列名", "sku.重复列名", "其他需要的列")
内容的提问来源于stack exchange,提问作者NAVEEN KUMAR REDDY BEDADALA
相关产品推荐
相关产品推荐

