pyspark使用partitionby分区数据

时间:2016-03-13 17:45:55

标签: python apache-spark pyspark partitioning rdd

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

  1. 我的理解是否正确?
  2. 建议分区数等于数量     可用核心?这会使处理更有效吗?
  3. 如果我的数据不是键值格式,该怎么办?我还能使用这个功能吗?
  4. 假设我的数据是serial_number_of_student,student_name。在这         case我可以通过student_name而不是         SERIAL_NUMBER?

2 个答案:

答案 0 :(得分:12)

  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. 这取决于类型。只要密钥 hashable *,那么是。通常,它意味着它必须是不可变结构,并且它包含的所有值也必须是不可变的。例如a list is not a valid key,但整数的tuple为。
  5. 引用Python glossary

      

    如果对象具有在其生命周期内永远不会更改的哈希值(它需要__hash__()方法),并且可以与其他对象进行比较(它需要__eq__()方法),则该对象是可清除的。比较相等的Hashable对象必须具有相同的哈希值。

答案 1 :(得分:-1)

我最近使用了partitionby。我所做的是重构我的数据,以便我想要放在同一个分区中的所有那些具有相同的密钥,而密钥又是数据中的值。我的数据是一个字典列表,我用字典中的密钥转换成了tupples。最初,partitionby没有在同一个分区中保存相同的密钥。但后来我意识到键是字符串。我把它们转换为int。但问题仍然存在。数字非常大。然后,我将这些数字映射到小数值,它工作。所以我的收获是密钥需要是小整数。