【问题标题】:Spark collect_set vs distinctSpark collect_set vs distinct
【发布时间】:2020-08-28 14:59:31
【问题描述】:

如果我的目标是将列中的不同值作为列表收集,那么使用其中任何一个是否存在性能差异或优缺点?

df.select(column).distinct().collect()...

df.select(collect_set(column)).first()...

【问题讨论】:

    标签: apache-spark apache-spark-sql


    【解决方案1】:

    collect_set 是一个聚合函数,开头需要一个groupBy。当没有提供分组时,它将把整个数据作为 1 个大组。

    1。收集集

    df.select(collect_set(column)).first()...
    

    这会将column 列的所有数据发送到单个节点,该节点将执行collect_set 操作(删除重复项)。如果您的数据量很大,那么它将淹没所有数据所在的单个执行程序。

    2。与众不同

    df.select(column).distinct().collect()...
    

    这将根据其值(称为分区键)对列column 的所有数据进行分区,不。分区数将是spark.sql.shuffle.partitions 的值(比如200)。因此将执行 200 个任务以删除重复项,每个分区键 1 个。然后只有 dedup 数据将发送到驱动程序以进行.collect() 操作。如果删除重复后的数据很大,这将失败,这将导致驱动程序内存不足。

    TLDR:

    .distinct.collect_set 更适合您的specific 需求

    【讨论】:

    • 谢谢萨米尔!我在哪里可以找到有关这些函数如何在后台执行 collect_set 的文档?我最初预计各个节点上的每个分区都会收集一组又名重复数据删除的大部分数据,然后以 map reduce 方式冒泡到单个节点以进一步重复数据删除,直到在这种情况下到达一个节点,以免使该单个节点过载.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    相关资源
    最近更新 更多