小编典典

如何确定对象是否是PySpark中的有效键值对

python

  1. 如果我有rdd,我如何理解数据为key:value格式?有没有办法找到相同的东西-像type(object)告诉我对象的类型。我试过了print type(rdd.take(1)),但这只是说<type 'list'>
  2. 假设我有一个类似的数据(x,1),(x,2),(y,1),(y,3),我使用 groupByKey和得到了(x,(1,2)),(y,(1,3))。有没有一种方法可以将x和y定义 为键(1,2)(1,3)值?还是键必须是单个值?我注意到,如果我使用reduceByKeysum函数来获取数据,((x,3),(y,4))那么将这些数据定义为键值对变得容易得多

阅读 199

收藏
2020-12-20

共1个答案

小编典典

Python是一种动态类型化的语言,PySpark对键,值对不使用任何特殊类型。将对象视为PairRDD操作的有效数据的唯一要求是可以按以下方式解压缩对象:

k, v = kv

通常,tuple由于其语义(固定大小的不可变对象)和与ScalaProduct类的相似性,您将使用两个元素。但这只是一个约定,没有什么可以阻止您执行以下操作:

key_value.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____getitem__魔术方法也应该起作用。处理此问题的最优雅的方法可能是使用namedtuples

type(rdd.take(1))返回一个listlength,n因此其类型将始终相同。

2020-12-20