【问题标题】:pyspark partitioning data using partitionbypyspark 使用 partitionby 对数据进行分区
【发布时间】:2023-03-17 01:04:01
【问题描述】:

我了解partitionBy 函数对我的数据进行分区。如果我使用rdd.partitionBy(100),它将按密钥将我的数据划分为 100 个部分。即与相似键关联的数据将被组合在一起

  1. 我的理解正确吗?
  2. 是否建议分区数等于 可用内核?这是否会提高处理效率?
  3. 如果我的数据不是键值格式怎么办。这个功能还能用吗?
  4. 可以说我的数据是serial_number_of_student,student_name。在这个 案例我可以通过 student_name 而不是 序列号?

【问题讨论】:

    标签: python apache-spark pyspark partitioning rdd


    【解决方案1】:
    1. 不完全是。 Spark,包括 PySpark,is by default using hash partitioning。排除相同的键,分配给单个分区的键之间没有实际的相似性。
    2. 这里没有简单的答案。一切都取决于数据量和可用资源。 Too large 或分区数太少会降低性能。

      Some resources 声称分区数应该是可用内核数的两倍左右。另一方面,单个分区通常不应包含超过 128MB 且单个 shuffle 块不能大于 2GB(请参阅SPARK-6235)。

      最后,您必须纠正潜在的数据偏差。如果某些键在您的数据集中出现过多,可能会导致资源使用欠佳和潜在故障。

    3. 不,或者至少不直接。您可以使用keyBy 方法将RDD 转换为所需的格式。此外,任何 Python 对象都可以被视为 键值对,只要它实现了所需的方法,使其行为类似于长度等于 2 的Iterable。见How to determine if object is a valid key-value pair in PySpark

    4. 这取决于类型。只要 key 是 hashable* 就可以。通常这意味着它必须是不可变的结构,并且它包含的所有值也必须是不可变的。例如 a list is not a valid key 但整数的 tuple 是。

    引用Python glossary

    如果一个对象的哈希值在其生命周期内永远不会改变(它需要一个__hash__() 方法),并且可以与其他对象进行比较(它需要一个__eq__() 方法),那么它就是可哈希的。比较相等的可散列对象必须具有相同的散列值。

    【讨论】:

      【解决方案2】:

      我最近使用了 partitionby。我所做的是重组我的数据,以便我想放在同一个分区中的所有那些都具有相同的键,而这又是数据中的一个值。我的数据是一个字典列表,我用字典中的键将其转换为元组。最初,partitionby 没有在同一个分区中保留相同的键。但后来我意识到键是字符串。我将它们转换为int。但问题依然存在。数字非常大。然后我将这些数字映射到小的数值,它起作用了。所以我的结论是键必须是小整数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-01
        • 1970-01-01
        • 2017-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-08
        相关资源
        最近更新 更多