Python 是一种动态类型语言,PySpark 不使用任何特殊类型的键、值对。对象被视为有效数据的唯一要求PairRDD
操作是可以按如下方式解包:
k, v = kv
通常您会使用两个元素tuple
由于其语义(固定大小的不可变对象)和与 Scala 的相似性Product
类。但这只是一个约定,没有什么可以阻止你这样做:
键值.py
class KeyValue(object):
def __init__(self, k, v):
self.k = k
self.v = v
def __iter__(self):
for x in [self.k, self.v]:
yield x
from key_value import KeyValue
rdd = sc.parallelize(
[KeyValue("foo", 1), KeyValue("foo", 2), KeyValue("bar", 0)])
rdd.reduceByKey(add).collect()
## [('bar', 0), ('foo', 3)]
并使任意类表现得像核心价值。因此,如果某个东西可以被正确地解包为一对对象,那么它就是一个有效的对象核心价值。实施__len__
and __getitem__
魔法方法应该也有效。处理这个问题最优雅的方法可能是使用namedtuples
.
Also type(rdd.take(1))
返回一个list
长度n
所以它的类型总是相同的。