当前位置: 首页 > 面试题库 >

一个列表作为PySpark的reduceByKey的键

谢旻
2023-03-14
问题内容

我正在尝试对格式的数据调用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]


问题答案:

尝试这个:

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()


 类似资料:
  • 我有一个像这样的rdd 来自评论: 这是我尝试的:

  • 我有一个pyspark数据帧,如下所示: 以及以下国家的名单: 我想做以下工作: 从列 为。对于,创建一个名为的列。基本上,为列出一个名为的额外列 如果包含列表中的任何国家,则新列应具有作为值,否则。这同样适用于列表中的其他国家 如果包含

  • 我在从一个表中插入一个列的值作为另一个表中的列时遇到了麻烦。我在col1中有一些值的表A:和另一个列等于col1值的表B。 我想把表A,col1中的其余值添加为表B中的列。请帮助我解决我的问题。我正在使用SQL server 2012。

  • 我创建了一个DataFrame,如下所示,我想对列标题应用映射减少算法,但是当我使用减少键函数时,我遇到了一些问题。 我试过这个,但不管用: 似乎我应该先将数据帧转移到列表中,然后使用映射函数生成键值对(word,1),最后求和键值。i一种从stackoverflow将数据框转移到列表的方法,例如 但是出现了一个错误

  • 问题内容: 这个问题已经在这里有了答案 : 如何在Python中将两个列表组合成字典?[重复] (6个答案) 5年前关闭。 Python中是否有将两个列表合并成字典的 内置 函数?喜欢: 哪里: 充当包含键的列表。 充当包含值的列表 有一个名为array_combine的函数可以实现此效果。 问题答案: 似乎这样应该可以,尽管我猜这不是 一个 单一的功能: 从这里开始:如何在Python中将两个列

  • 我有两个数据帧,我需要连接一列,如果id包含在第二个数据帧的同一列中,则只从第一个数据帧中获取行: df1: 断续器: 期望输出: 我已经用df1.join(df2("id ")," left ")试过了,但是给我错误:“Dataframe”对象是不可调用的。