我有兩個我希望加入的資料框,然后另存為鑲木地板。執行連接后,我的結果表有重復的列,阻止我保存資料集。
這是我的加入代碼
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() 不會拋出例外,這意味著別名可能是錯誤的/沒有按我的預期作業?
我不能將連接條件作為字串串列執行,因為當在每個 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 示例代碼的答案將不勝感激。
uj5u.com熱心網友回復:
我不知道為什么它不起作用,它真的很奇怪。
這不是那么漂亮,但它有效
from pyspark.sql import functions as F
data = [{'colX': "hello", 'col1': 1, 'col2': 2, 'col3': 3}]
data2 = [{'colY': "hello", 'col1': 1, 'col2': 2, 'col3': 3}]
df1 = spark.createDataFrame(data)
df2 = spark.createDataFrame(data2)
join_cond = [df1.colX==df2.colY,
df1.col1==df2.col1,
df1.col2==df2.col2,
df1.col3==df2.col3]
df1.join(F.broadcast(df2), join_cond, 'inner').drop(df1.col1).drop(df1.col2).drop(df1.col3).printSchema()
root
|-- colX: string (nullable = true)
|-- col1: long (nullable = true)
|-- col2: long (nullable = true)
|-- col3: long (nullable = true)
|-- colY: string (nullable = true)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/371041.html
