【发布时间】:2022-01-06 23:58:01
【问题描述】:
我有两个希望加入的数据框,然后另存为镶木地板表。执行连接后,我的结果表有重复的列,阻止我保存数据集。
这是我的加入代码
join_conditions = [
df1.colX == df2.colY,
df1.col1 == df2.col1,
df1.col2 == df2.col2,
df1.col3 == df2.col3,
]
dfj= df1.alias("1").join(F.broadcast(df2.alias("2")), join_conditions, "inner"
).drop("1.col1", "1.col2", "1.col3")
dfj.write.format("parquet").mode("overwrite").saveAsTable("table")
我希望 drop 会删除重复的列,但是当我尝试保存表时,会抛出一个异常,说它们仍然存在。如果列不存在,drop() 不会抛出异常,这意味着别名可能是错误的/没有按我预期的那样工作?
我不能将连接条件作为字符串列表来执行,因为当连接条件中的所有列在每个 DataFrame 上的名称并非相同时,这似乎会导致错误:
join_conditions = [
df1.colX == df2.colY,
"col1",
"col2",
"col3"
]
例如不起作用。
此连接有效,但仍会导致重复列
join_conditions = [
df1.X == df2.colY,
F.col("1.col1") == F.col("2.col1"),
F.col("1.col2") == F.col("2.col2"),
F.col("1.col3") == F.col("2.col3"),
]
也没有用。所有这些方法仍然会导致连接的数据帧具有重复的列 col1、col2 和 col3。我做错了什么/没有正确理解? pyspark 示例代码的答案将不胜感激。
【问题讨论】:
-
将 colX 重命名为 colY 并仅使用列名加入。
-
这是最简单的解决方案。我认为我上面写的内容实际上应该有效,但没有 - 鉴于重命名是最有意义的,这意味着我根本不必有别名或掉线。
标签: python apache-spark hadoop pyspark