一个列表作为PySpark的reduceByKey的键

发布于 2021-01-29 19:08:59

我正在尝试对格式的数据调用pyspark的reduceByKey函数 (([a,b,c], 1), ([a,b,c], 1), ([a,d,b,e], 1), ...

似乎pyspark不会接受数组作为普通键中的键,通过简单地应用.reduceByKey(add)可以减少值。

我已经尝试过先将数组转换为字符串,.map((x,y): (str(x),y))但是这样做不起作用,因为将字符串后处理回数组的速度太慢。

有没有办法让pyspark将数组用作键或使用另一个函数将字符串快速转换回数组?

这是相关的错误代码

  File "/home/jan/Documents/spark-1.4.0/python/lib/pyspark.zip/pyspark/shuffle.py", line 268, in mergeValues
    d[k] = comb(d[k], v) if k in d else creator(v)
TypeError: unhashable type: 'list'
    enter code here

摘要

输入:x =[([a,b,c], 1), ([a,b,c], 1), ([a,d,b,e], 1), ...]

所需的输出:y =[([a,b,c], 2), ([a,d,b,e], 1),...]
使得我可以访问ay[0][0][0]2y[0][1]

关注者
0
被浏览
39
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    尝试这个:

    rdd.map(lambda (k, v): (tuple(k), v)).groupByKey()
    

    由于Python列表是可变的,这意味着无法进行哈希处理(不提供__hash__方法):

    >>> a_list = [1, 2, 3]
    >>> a_list.__hash__ is None
    True
    >>> hash(a_list)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'list'
    

    另一方面,元组是不可变的,并提供__hash__方法实现:

    >>> a_tuple = (1, 2, 3)
    >>> a_tuple.__hash__ is None
    False
    >>> hash(a_tuple)
    2528502973977326415
    

    因此可以用作密钥。同样,如果要将唯一值用作键,则应使用frozenset

    rdd.map(lambda (k, v): (frozenset(k), v)).groupByKey().collect()
    

    代替set

    # This will fail with TypeError: unhashable type: 'set'
    rdd.map(lambda (k, v): (set(k), v)).groupByKey().collect()
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看