Pyspark 自联接错误“缺少已解决的属性”

Posted

技术标签:

【中文标题】Pyspark 自联接错误“缺少已解决的属性”【英文标题】:Pyspark self-join with error "Resolved attribute(s) missing" 【发布时间】:2019-07-02 18:24:08 【问题描述】:

在执行 pyspark 数据帧自联接时,我收到一条错误消息:

Py4JJavaError: An error occurred while calling o1595.join.
: org.apache.spark.sql.AnalysisException: Resolved attribute(s) un_val#5997 missing from day#290,item_listed#281,filename#286 in operator !Project [...]. Attribute(s) with the same name appear in the operation: un_val. Please check if the right attribute(s) are used.;;

这是一个简单的数据框自连接,如下所示,工作正常,但在对数据框进行了几次操作(如添加列或与其他数据框连接)后,就会引发上述错误。

df.join(df,on='item_listed')

使用像下面这样的数据框别名也不起作用,并且会引发相同的错误消息:

df.alias('A').join(df.alias('B'), col('A.my_id') == col('B.my_id'))

【问题讨论】:

【参考方案1】:

我在这里找到了一个 Java 解决方法 SPARK-14948,对于 pyspark 来说是这样的:

#Add a "_r" suffix to column names array
newcols = [c + '_r' for c in df.columns]

#clone the dataframe with columns renamed
df2 = df.toDF(*newcols)

#self-join
df.join(df2,df.my_column == df2.my_column_r)

【讨论】:

以上是关于Pyspark 自联接错误“缺少已解决的属性”的主要内容,如果未能解决你的问题,请参考以下文章

错误:连接中缺少已解决的属性

Mysql 自联接性能

进行递归自联接的最简单方法?

使用 DataFrame API 时,自联接无法按预期工作

使用分组查询自联接

自联接的困难 MySQL 更新查询