pyspark使用partitionby分区数据

use*_*622 11 python partitioning apache-spark rdd pyspark

我知道该partitionBy功能会分区我的数据.如果我使用rdd.partitionBy(100)它将按键将我的数据分成100个部分.即,与类似键相关联的数据将被组合在一起

  1. 我的理解是否正确?
  2. 是否建议将分区数等于可用内核数?这会使处理更有效吗?
  3. 如果我的数据不是键值格式怎么办?我还能使用这个功能吗?
  4. 假设我的数据是serial_number_of_student,student_name.在这种情况下,我可以通过student_name而不是serial_number对我的数据进行分区吗?

zer*_*323 13

  1. 不完全是.Spark,包括PySpark,默认使用散列分区.排除相同的密钥,分配给单个分区的密钥之间没有实际的相似性.
  2. 这里没有简单的答案.全部取决于数据量和可用资源.分区数量太大或太少都会降低性能.

    一些资源声称分区数量应该是可用核心数量的两倍左右.另一方面,单个分区通常不应超过128MB,单个shuffle块不能超过2GB(参见SPARK-6235).

    最后,您必须纠正潜在的数据偏差.如果某些密钥在您的数据集中过多,则可能导致资源使用次优和潜在失败.

  3. 不,或者至少不是直接的.您可以使用keyBy方法将RDD转换为所需的格式.此外,任何Python对象都可以被视为键值对,只要它实现了所需的方法,使其行为类似于Iterable长度等于2.请参阅如何确定对象是否是PySpark中的有效键值对

  4. 这取决于类型.只要密钥可以清洗*然后是.通常,它意味着它必须是不可变结构,并且它包含的所有值也必须是不可变的.例如,列表不是有效键,而是tuple整数.

引用Python词汇表:

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