为什么“ groupBy agg计数别名”不创建新列?

时间:2018-11-08 12:47:12

标签: apache-spark hadoop apache-spark-sql

我有以下代码:

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").desc替换为desc("count")时,它开始起作用,但是我不明白为什么。有人可以解释吗?

1 个答案:

答案 0 :(得分:0)

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

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

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