我有以下代码:
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")
时,它开始起作用,但是我不明白为什么。有人可以解释吗?
答案 0 :(得分:0)
因为 df 是原始数据帧,并且df(“ count”)尝试返回不在原始数据帧中的列,所以数据帧是无法修改的不可变对象,您只能将队列转换会返回新数据帧而不修改原始数据帧,因此groupby和agg不会修改原始 df 数据帧,而是返回具有排队转换的新数据帧(Spark是惰性的)。
desc(“ count”)是一个函数,该函数将在当前数据框中查找名称为“ count”的列,该列不是原始的 df ,但由 gorupby + agg 组合创建的,已经具有“计数”列。
顺便说一句,您可以在多个转换中重复使用 df 。