使用partitionby的pyspark分区数据

2024-04-23 22:54:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道partitionBy函数对我的数据进行分区。如果我使用rdd.partitionBy(100),它将按键将数据分成100个部分。i、 e.与相似键相关的数据将被组合在一起

  1. 我的理解正确吗?
  2. 建议分区的数量等于 可用的核心?这会使处理更有效吗?
  3. 如果我的数据不是键值格式怎么办。我还能用这个功能吗?
  4. 假设我的数据是学生的序列号,学生的名字。在这个 我可以用学生名而不是 序列号?

Tags: 数据函数功能核心数量格式名字学生
2条回答

我最近用了partitionby。我所做的是重新构造我的数据,以便我想放在同一分区中的所有数据都有相同的键,而键又是数据中的一个值。我的数据是一个字典列表,我用字典中的键将其转换成元组。最初,partitionby并没有将相同的键保存在同一个分区中。但后来我意识到钥匙是字符串。我把它们转换成int,但问题仍然存在。数字很大。然后我把这些数字映射成小数值,然后就成功了。所以我得到的结论是键必须是小整数。

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

    Some resources声明分区的数量应该是可用核心数量的两倍左右。另一方面,单个分区通常不应包含超过128MB的数据,单个无序块不能大于2GB(请参见SPARK-6235)。

    最后,必须纠正潜在的数据倾斜。如果某些键在数据集中出现过多,则可能会导致资源使用不理想,并可能导致失败。

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

  4. 这取决于类型。只要键是可散列的,则为“是”。通常它意味着它必须是不可变的结构,它包含的所有值也必须是不可变的。例如a list is not a valid key,但整数的tuple是。

引用Python glossary

An object is hashable if it has a hash value which never changes during its lifetime (it needs a __hash__() method), and can be compared to other objects (it needs an __eq__() method). Hashable objects which compare equal must have the same hash value.

相关问题 更多 >