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
答案 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