我理解partitionBy
函数对我的数据进行分区。如果我使用rdd.partitionBy(100)
,它会按键将我的数据分成100个部分。即,与类似密钥相关的数据将被分组在一起
答案 0 :(得分:12)
这里没有简单的答案。全部取决于数据量和可用资源。 Too large或分区数量太少会降低性能。
Some resources声称分区数量应该是可用内核数量的两倍左右。另一方面,单个分区通常不应包含128MB以上,单个shuffle块不能大于2GB(参见SPARK-6235)。
最后,您必须纠正潜在的数据偏差。如果某些密钥在您的数据集中过多,则可能导致资源使用不佳和潜在失败。
不,或者至少不是直接。您可以使用keyBy
方法将RDD转换为所需格式。此外,任何Python对象都可以被视为键值对,只要它实现了所需的方法,使其行为类似于长度等于2的Iterable
。请参阅How to determine if object is a valid key-value pair in PySpark
tuple
为。如果对象具有在其生命周期内永远不会更改的哈希值(它需要
__hash__()
方法),并且可以与其他对象进行比较(它需要__eq__()
方法),则该对象是可清除的。比较相等的Hashable对象必须具有相同的哈希值。
答案 1 :(得分:-1)
我最近使用了partitionby。我所做的是重构我的数据,以便我想要放在同一个分区中的所有那些具有相同的密钥,而密钥又是数据中的值。我的数据是一个字典列表,我用字典中的密钥转换成了tupples。最初,partitionby没有在同一个分区中保存相同的密钥。但后来我意识到键是字符串。我把它们转换为int。但问题仍然存在。数字非常大。然后,我将这些数字映射到小数值,它工作。所以我的收获是密钥需要是小整数。