pyspark.sql.utils.AnalysisException: 列不明确但没有重复的列名

pyspark.sql.utils.AnalysisException: Column ambiguous but no duplicate column names

我在加入数据框的 id 列时遇到不明确的列异常,但数据框中没有重复的列。什么可能导致抛出此错误?

Join 操作,其中 ainput 已被其他函数处理:

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: Column id#23711L are ambiguous. It's probably because you joined several Datasets together, and some of these Datasets are the same. This column points to one of the Datasets but Spark is unable to figure out which one. Please alias the Datasets with different names via Dataset.as before joining them, and specify the column using qualified name, e.g. df.as("a").join(df.as("b"), $"a.id" > $"b.id"). You can also set spark.sql.analyzer.failAmbiguousSelfJoin to false to disable this check.;

如果我使用相同的模式重新创建数据框,我不会收到任何错误:

b_clean = spark_session.createDataFrame([], b.schema)
a.join(b_clean, b_clean['id'] == a['item'])

我可以查看什么来排查原始数据帧发生的会导致不明确列错误的问题?

此错误以及您的 sii 列在两个表中具有相同 ID 的事实(即 sii#24665L)表明 ab 数据帧均已创建使用相同的来源。因此,从本质上讲,这使您的加入成为 self join(正是错误消息所告诉的内容)。在这种情况下,建议对数据帧使用 alias。试试这个:

a.alias('a').join(b.alias('b'), F.col('b.id') == F.col('a.item'))

同样,在某些系统中,您可能无法保存结果,因为生成的数据框将包含 2 sii 列。我建议只明确 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')
    )
)