Apache spark org.apache.spark.sql.AnalysisException:已解析属性

Apache spark org.apache.spark.sql.AnalysisException:已解析属性,apache-spark,pyspark,Apache Spark,Pyspark,通常我在Scala API上使用Spark,但是我必须在pyspark中编写一些东西,并得到难以排除的错误 我正在3个DFs上进行连接: df_c = gr_o.select("col1", "col2", "col3", "col4").join(gr_r.select("col1", "col5"), "col1", how='left').join(gr_v.select("col1", "col6"), "col1", how='left') 当我执行df_c.show()时,会出现以

通常我在Scala API上使用Spark,但是我必须在pyspark中编写一些东西,并得到难以排除的错误

我正在3个DFs上进行连接:

df_c = gr_o.select("col1", "col2", "col3", "col4").join(gr_r.select("col1", "col5"), "col1", how='left').join(gr_v.select("col1", "col6"), "col1", how='left')
当我执行
df_c.show()
时,会出现以下错误:

py4j.protocol.Py4JJavaError: An error occurred while calling o724.join.
: org.apache.spark.sql.AnalysisException: resolved attribute(s)......
During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 20, in fun
  File "/spark/python/pyspark/sql/dataframe.py", line 828, in join
    jdf = self._jdf.join(other._jdf, on, how)
  File "/spark/spark/python/lib/py4j-0.10.4-src.zip/py4j/java_gateway.py", line 1133, in __call__
  File "/spark/spark/python/pyspark/sql/utils.py", line 69, in deco
    raise AnalysisException(s.split(': ', 1)[1], stackTrace)
pyspark.sql.utils.AnalysisException: 'resolved attribute(s)
py4j.protocol.Py4JJavaError:调用o724.join时出错。
:org.apache.spark.sql.AnalysisException:已解析属性。。。。。。
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第20行,有趣
文件“/spark/python/pyspark/sql/dataframe.py”,第828行,在join中
jdf=self.\ujdf.join(其他.\ujdf,on,how)
文件“/spark/spark/python/lib/py4j-0.10.4-src.zip/py4j/java_gateway.py”,第1133行,在__
文件“/spark/spark/python/pyspark/sql/utils.py”,第69行,deco格式
引发分析异常(s.split(“:”,1)[1],stackTrace)
pyspark.sql.utils.AnalysisException:'已解析属性

DF的源代码是一个视图,当我使用表而不是视图时,它就工作了。我想知道是否有人经历过类似的问题

为了使生产代码中的其他开发人员具有更好的可读性,您应该始终同样地分解数据帧。这有助于简化调试和理解 现在,问题来了,这看起来像是与列相关的不匹配

gr_o = gr_o.select("col1", "col2", "col3", "col4")
gr_r = gr_r.select("col1", "col5")
gr_v = gr_v.select("col1", "col6")

df_c = gr_o.join(gr_r,"col1","left")
df_c = df_c.join(gr_v,"col1","left")

我想把我用过的解决方案放在这里,也许有人会觉得有用。我仍然不知道为什么它不能正常工作,看起来像pyspark中的一个bug。基本上我把一个列的别名放在一个数据帧中,别名与实际的列名同名(col1和col1)

df_c = (
    gr_o
    .select("col1", "col2", "col3", "col4")
    .join(gr_r.selectExpr("col1 as col1", "col5"), "col1", how='left')
    .join(gr_v.select("col1", "col6"), "col1", how='left')
)

你能发布完整的代码吗?试着对视图使用显式命名,即我的视图。col_名称对我来说像是一个不明确的列名,阅读下面的这篇文章@RainaMegha看看我的select语句我没有任何含糊不清的列。我通过Scala API检查了相同的查询,它们工作得很好。我将尝试按照上面的建议在上游查询中显式指定列。我很困惑,您对我的问题的实际答案是什么?