org.apache.spark.sql.AnalysisException: 无法解析给定的输入列

org.apache.spark.sql.AnalysisException: cannot resolve given input columns

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)]

就像求和函数无法正确找到列名一样。

使用 Spark 2.1

通常在这种情况下,我会在列上使用 as 方法。例如 .agg(first("accid"), first("segment"), $"exiturl", sum("session").as("session"), sum("sessionfirst"), first("date"))。这使您可以更好地控制期望的内容,如果求和名称在未来的 spark 版本中发生变化,那么更新数据集中的所有名称就不会那么令人头疼了。

另外,我只是运行一个简单的测试。当您不指定名称时,看起来 Spark 2.1 中的名称会更改为 "sum(session)"。自己找到它的一种方法是在数据集上调用 printSchema。

我更喜欢使用 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"