PySpark新手求助:如何按DataFrame列表列中的单个国家分组
解决PySpark按列表列中的单个国家分组统计的问题
嗨,作为PySpark新手碰到这种嵌套列表的分组需求很正常,我来给你一步步拆解解决方案:
核心思路
要按列表里的单个国家分组,首先得把数组列展开成单行单个国家,然后再进行常规的分组统计操作。
具体步骤及代码实现
假设你的原DataFrame名称为df,我们可以用PySpark内置的函数来完成:
- 导入所需函数
from pyspark.sql.functions import explode, count, trim
- 展开数组列
用explode函数把countries列里的每个国家单独拆成一行,对应原列表的空值会生成null:
exploded_df = df.withColumn("country", explode(df.countries))
- 清洗数据
- 过滤掉
null值(对应原数据里的空列表) - 用
trim去除国家名称前后的空格(比如你数据里最后一行的Великобритания带有尾部空格,避免分组时被当成不同项)
cleaned_df = exploded_df.filter("country is not null").withColumn("country", trim("country"))
- 分组统计
对清洗后的country列进行分组,并用count统计每个国家出现的次数:
result_df = cleaned_df.groupBy("country").agg(count("*").alias("count"))
- 查看结果
result_df.show()
运行后你会得到每个国家的统计结果,示例输出大致如下:
+-----------------+-----+ | country|count| +-----------------+-----+ | Россия| 5| | Китай| 1| |Великобритания| 2| | Норвегия| 1| | США| 3| | Италия| 1| | Грузия| 1| | Беларусь| 1| +-----------------+-----+
补充说明
如果需要保留原数据里的空列表并统计其数量,可以把explode换成explode_outer,同时去掉过滤null的步骤,这样空列表会被统计为null项的数量。
内容的提问来源于stack exchange,提问作者Oleg Zdanevich
相关产品推荐
相关产品推荐

