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"
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"