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

时间:2017-05-09 16:29:18

标签: scala apache-spark dataframe apache-spark-sql spark-jobserver

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

3 个答案:

答案 0 :(得分:6)

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

另外,我刚刚进行了一个简单的测试。如果您没有指定名称,则看起来Spark 2.1中的名称会更改为" sum(session)"。自己找到这种方法的一种方法是在数据集上调用printSchema。

答案 1 :(得分:3)

我更喜欢使用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具有的所有列,但该总和("会话")列现在已重命名为" session"

答案 2 :(得分:0)

默认情况下,从spark2.0 spark-shell与hive一起启用。 我们可以使用以下命令禁用蜂巢支持。

spark-shell --conf spark.sql.catalogImplementation=in-memory