org.apache.spark.sql.AnalysisException:无法解析给定的输入列
Posted
技术标签:
【中文标题】org.apache.spark.sql.AnalysisException:无法解析给定的输入列【英文标题】:org.apache.spark.sql.AnalysisException: cannot resolve given input columns 【发布时间】:2017-05-09 16:29:18 【问题描述】:exitTotalDF
.filter($"accid" === "dc215673-ef22-4d59-0998-455b82000015")
.groupBy("exiturl")
.agg(first("accid"), first("segment"), $"exiturl", sum("session"), sum("sessionfirst"), first("date"))
.orderBy(desc("session"))
.take(500)
org.apache.spark.sql.AnalysisException: cannot resolve '`session`' given input columns: [first(accid, false), first(date, false), sum(session), exiturl, sum(sessionfirst), first(segment, false)]
就像 sum 函数找不到正确的列名一样。
使用 Spark 2.1
【问题讨论】:
【参考方案1】:通常在这种情况下,我将在列上使用as
方法。例如.agg(first("accid"), first("segment"), $"exiturl", sum("session").as("session"), sum("sessionfirst"), first("date"))
。这使您可以更好地控制预期的内容,并且如果总和名称在未来版本的 spark 中发生变化,您将不必担心更新数据集中的所有名称。
另外,我只是进行了一个简单的测试。当您不指定名称时,看起来 Spark 2.1 中的名称已更改为“sum(session)”。自己找到它的一种方法是在数据集上调用 printSchema。
【讨论】:
【参考方案2】:我更喜欢使用withColumnRenamed()
而不是as()
,因为:
对于as()
,必须像这样列出他需要的所有列:
df.select(first("accid"),
first("segment"),
$"exiturl",
col('sum("session")').as("session"),
sum("sessionfirst"),
first("date"))
VS withColumnRenamed
是一个班轮:
df1 = df.withColumnRenamed('sum("session")', "session")
输出 df1
将包含 df 的所有列,除了 sum("session") 列现在重命名为 "session"
【讨论】:
以上是关于org.apache.spark.sql.AnalysisException:无法解析给定的输入列的主要内容,如果未能解决你的问题,请参考以下文章