为何PySpark中df.selectExpr("distinct(DEST_COUNTRY_NAME)")无法运行?
问题根源
Spark SQL里不存在distinct()这种单参数函数,distinct是行级去重的关键字,并非可直接调用的函数。而count(distinct 列名)是聚合函数count的特殊用法,和单独使用distinct的逻辑完全不同,因此不会触发报错。
解决办法
除了你已经验证通过的两种写法,还可以用这些等价方式实现获取单列唯一值:
- 用
dropDuplicates替代distinct,效果完全一致:unique_values_df = df.select("DEST_COUNTRY_NAME").dropDuplicates() - 如果一定要结合
selectExpr使用,可采用如下语法(本质和你已用的第二种写法逻辑一致):unique_values_df = df.selectExpr("DEST_COUNTRY_NAME").distinct()
语法差异说明
df.select("DEST_COUNTRY_NAME").distinct():先选中目标列,再对整列的行做去重处理,返回包含所有唯一值的数据集df.selectExpr("count(distinct(DEST_COUNTRY_NAME))"):属于聚合统计操作,计算该列唯一值的总数量,返回的是单个统计数值而非唯一值列表- 核心误区:误将
distinct当成普通函数调用,Spark SQL中不存在distinct(列名)这种语法,这是触发报错的直接原因
内容的提问来源于stack exchange,提问作者Heejun Kim
相关产品推荐
相关产品推荐

