apache-spark - 为什么“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").desc
它desc("count")
开始工作时,但我不明白为什么。有人可以解释吗?
解决方案
因为df是原始数据帧并且 df("count") 尝试返回不在原始数据帧中的列,所以数据帧是无法修改的不可变对象,您只能对返回新数据帧的转换进行排队,而无需修改原始数据帧,因此 groupby 和 agg 不会修改原始的df数据帧,而是返回带有排队转换的新数据帧(Spark 是惰性的)。
desc("count")是一个函数,它将在当前数据帧中查找名称为“count”的列,该列不是原始的df,而是由gorupby + agg组合创建的列,它已经具有“count”柱子。
顺便说一句,您可以在多个转换中重复使用df 。
推荐阅读
- javascript - 完成的 JS / HTML / CSS 代码与 Wordpress WPBakery 冲突,无法实现
- node.js - 为什么重新连接成功时socket.io客户端会重新发送离线消息?
- c - 消除字符串的特殊字符在空格处停止
- javascript - 创建一个将合并所有对象参数的函数
- javafx - 父节点中 needsLayout 属性的用途
- python-3.x - 过滤具有特定值的所有行,而不指定列名
- javascript - 抄送收件人的 Mandrill 合并变量不起作用
- python - Tensorflow 似乎使用的是系统内存而不是 GPU,并且程序在 global_variable_initializer() 之后停止
- android - android编辑文本设计-删除编辑文本行底部填充并更改填充之间的文本和行
- python - 使用格式查询 Elasticsearch 以解析日期字段