加入資料框的列時出現模棱兩可的列例外id,但資料框中沒有重復的列。什么可能導致這個錯誤被拋出?
加入操作,其中a和input已經被其他函式處理過:
b = (
input
.where(F.col('st').like('%VALUE%'))
.select('id', 'sii')
)
a.join(b, b['id'] == a['item'])
資料框:
(Pdb) a.explain()
== Physical Plan ==
*(1) Scan ExistingRDD[item#25280L,sii#24665L]
(Pdb) b.explain()
== Physical Plan ==
*(1) Project [id#23711L, sii#24665L]
- *(1) Filter (isnotnull(st#25022) AND st#25022 LIKE %VALUE%)
- *(1) Scan ExistingRDD[id#23711L,st#25022,sii#24665L]
例外:
pyspark.sql.utils.AnalysisException:列 id#23711L 不明確。這可能是因為您將幾個 Datasets 連接在一起,并且其中一些 Datasets 是相同的。此列指向其中一個資料集,但 Spark 無法確定是哪一個。在加入資料集之前,請使用不同名稱的資料集別名
Dataset.as,并使用限定名稱指定列,例如df.as("a").join(df.as("b"), $"a.id" > $"b.id"). 您還可以將 spark.sql.analyzer.failAmbiguousSelfJoin 設定為 false 以禁用此檢查。
如果我使用相同的模式重新創建資料框,我不會收到任何錯誤:
b_clean = spark_session.createDataFrame([], b.schema)
a.join(b_clean, b_clean['id'] == a['item'])
我可以查看什么來解決原始資料幀發生的問題,這些問題會導致不明確的列錯誤?
uj5u.com熱心網友回復:
此錯誤以及您的列在兩個表(即)sii中具有相同 id的事實表明兩者和資料框都是使用相同的來源制作的。因此,從本質上講,這使您的加入成為自加入(正是錯誤訊息所告訴的內容)。在這種情況下,建議使用資料幀。試試這個:sii#24665Labalias
a.alias('a').join(b.alias('b'), F.col('b.id') == F.col('a.item'))
同樣,在某些系統中,您可能無法保存結果,因為生成的資料框將有 2sii列。我會建議明確地select只顯示您需要的列。alias如果您決定需要兩個重復的列,使用重命名列也可能會有所幫助。例如:
df = (
a.alias('a').join(b.alias('b'), F.col('b.id') == F.col('a.item'))
.select('item',
'id',
F.col('a.sii').alias('a_sii')
)
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/464455.html
標籤:阿帕奇火花 加入 pyspark apache-spark-sql 模糊的
下一篇:根據一列中的值洗掉重復行
