首页 > 解决方案 > 为什么“groupBy agg count alias”不创建新列?

问题描述

我有以下代码:

def getResults(df: DataFrame) : Dataset[Row] = {
df.filter(df("srch_adults_cnt") > 0)
  .filter(df("srch_children_cnt") > 0)
  .filter(df("is_booking") === 0)
  .groupBy("hotel_country", "hotel_market", "hotel_continent")
  .agg(count("*").alias("count"))
  .orderBy(df("count").desc)
  .limit(3)
}

它在这一行失败了:.orderBy(df("count").desc),说没有这样的专栏count。这是为什么?

当我替换df("count").descdesc("count")开始工作时,但我不明白为什么。有人可以解释吗?

标签: apache-sparkhadoopapache-spark-sql

解决方案


因为df是原始数据帧并且 df("count") 尝试返回不在原始数据帧中的列,所以数据帧是无法修改的不可变对象,您只能对返回新数据帧的转换进行排队,而无需修改原始数据帧,因此 groupby 和 agg 不会修改原始的df数据帧,而是返回带有排队转换的新数据帧(Spark 是惰性的)。

desc("count")是一个函数,它将在当前数据帧中查找名称为“count”的列,该列不是原始的df,而是由gorupby + agg组合创建的列,它已经具有“count”柱子。

顺便说一句,您可以在多个转换中重复使用df 。


推荐阅读