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:无法解析给定的输入列的主要内容,如果未能解决你的问题,请参考以下文章