Databricks中不使用RDD将PySpark DataFrame列转为列表的方法
解决PySpark DataFrame列转无冗余列表的方法
当你用df.select('col_name').collect()得到的是包含Row对象的列表(比如[Row(col_name=1), Row(col_name=2)]),这些Row就是你感知到的“冗余值”。不用RDD的话,有两种简单方法可以提取纯值列表:
方法一:列表推导式直接提取Row字段
这是最直观的方式,遍历collect()返回的Row列表,逐个提取对应列的值:
# 提取列名为col_name的纯值列表 col_values = [row.col_name for row in df.select('col_name').collect()] # 如果列名是动态生成的,也可以用键值访问 # col_values = [row['col_name'] for row in df.select('col_name').collect()]
方法二:用Spark内置函数collect_list在集群端聚合
如果数据量不算特别大,可以先用collect_list函数在Spark侧把列值聚合为一个列表,再拉取到Driver端:
from pyspark.sql import functions as F # 聚合得到包含单列列表的DataFrame agg_df = df.agg(F.collect_list('col_name').alias('col_values_list')) # 提取列表 col_values = agg_df.first()['col_values_list']
两种方法的注意事项
- 方法一适合小数据量场景:
collect()会把所有Row数据拉到Driver端,数据量过大可能导致Driver内存不足。 - 方法二要注意数据规模:
collect_list会把所有列值聚合到一个分区,数据量极大时可能触发OOM,此时建议先过滤或采样数据。
内容的提问来源于stack exchange,提问作者doubleD
相关产品推荐
相关产品推荐

