【问题标题】:how does sortWithinPartitions sort?sortWithinPartitions 如何排序?
【发布时间】:2021-06-06 14:13:12
【问题描述】:

将 sortWithinPartitions 应用于 df 并将输出写入表后,我得到了一个结果,但我不确定如何解释。

df
.select($"type", $"id", $"time")
.sortWithinPartitions($"type", $"id", $"time")

结果文件看起来有点像

1 a 5
2 b 1
1 a 6
2 b 2
1 a 7
2 b 3
1 a 8
2 b 4

它实际上并不是随机的,但也没有像我期望的那样排序。即,首先按类型,然后是 id,然后是时间。 如果我在排序之前尝试使用重新分区,那么我会得到我想要的结果。但由于某种原因,文件的重量增加了 5 倍(100gb 对 20gb)。

我正在写一个 hive orc 表,压缩设置为 snappy。

有谁知道为什么它是这样排序的,为什么重新分区的顺序正确,但尺寸更大?

使用火花 2.2。

【问题讨论】:

    标签: apache-spark orc columnsorting snappy


    【解决方案1】:

    sortWithinPartition 状态的文档

    返回一个新的数据集,每个分区按给定的表达式排序

    考虑这个函数的最简单方法是想象第四列(分区 id)用作主要排序标准。函数spark_partition_id() 打印分区。

    例如,如果您只有一个大分区(您作为 Spark 用户永远不会这样做!),sortWithinPartition 就像正常排序一样工作:

    df.repartition(1)
      .sortWithinPartitions("type","id","time")
      .withColumn("partition", spark_partition_id())
      .show();
    

    打印

    +----+---+----+---------+
    |type| id|time|partition|
    +----+---+----+---------+
    |   1|  a|   5|        0|
    |   1|  a|   6|        0|
    |   1|  a|   7|        0|
    |   1|  a|   8|        0|
    |   2|  b|   1|        0|
    |   2|  b|   2|        0|
    |   2|  b|   3|        0|
    |   2|  b|   4|        0|
    +----+---+----+---------+
    

    如果分区比较多,结果只在每个分区内排序:

    df.repartition(4)
      .sortWithinPartitions("type","id","time")
      .withColumn("partition", spark_partition_id())
      .show();
    

    打印

    +----+---+----+---------+
    |type| id|time|partition|
    +----+---+----+---------+
    |   2|  b|   1|        0|
    |   2|  b|   3|        0|
    |   1|  a|   5|        1|
    |   1|  a|   6|        1|
    |   1|  a|   8|        2|
    |   2|  b|   2|        2|
    |   1|  a|   7|        3|
    |   2|  b|   4|        3|
    +----+---+----+---------+
    

    为什么要使用sortWithPartition 而不是sortsortWithPartition 不会触发 shuffle,因为数据仅在执行程序内移动。 sort 但是会触发随机播放。因此sortWithPartition 执行得更快。如果数据按有意义的列进行分区,则在每个分区内进行排序可能就足够了。

    【讨论】:

      猜你喜欢
      • 2023-03-26
      • 2012-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多