【发布时间】:2020-08-28 14:59:31
【问题描述】:
如果我的目标是将列中的不同值作为列表收集,那么使用其中任何一个是否存在性能差异或优缺点?
df.select(column).distinct().collect()...
对
df.select(collect_set(column)).first()...
【问题讨论】:
标签: apache-spark apache-spark-sql
如果我的目标是将列中的不同值作为列表收集,那么使用其中任何一个是否存在性能差异或优缺点?
df.select(column).distinct().collect()...
对
df.select(collect_set(column)).first()...
【问题讨论】:
标签: apache-spark apache-spark-sql
collect_set 是一个聚合函数,开头需要一个groupBy。当没有提供分组时,它将把整个数据作为 1 个大组。
df.select(collect_set(column)).first()...
这会将column 列的所有数据发送到单个节点,该节点将执行collect_set 操作(删除重复项)。如果您的数据量很大,那么它将淹没所有数据所在的单个执行程序。
df.select(column).distinct().collect()...
这将根据其值(称为分区键)对列column 的所有数据进行分区,不。分区数将是spark.sql.shuffle.partitions 的值(比如200)。因此将执行 200 个任务以删除重复项,每个分区键 1 个。然后只有 dedup 数据将发送到驱动程序以进行.collect() 操作。如果删除重复后的数据很大,这将失败,这将导致驱动程序内存不足。
.distinct 比.collect_set 更适合您的specific 需求
【讨论】: