我在pyspark中有一个如下所示的数据集:
samp = sc.parallelize([(1,'TAGA'), (1, 'TGGA'), (1, 'ATGA'), (1, 'GTGT'), (2, 'GTAT'), (2, 'ATGT'), (3, 'TAAT'), (4, 'TAGC')])
我有一个我用来组合字符串的功能:
def combine_strings(x,y):
if (isinstance(x,list) and isinstance(y, list)):
z = x + y
return z
if (isinstance(x, list) and isinstance(y, str)):
x.append(y)
return x
if (isinstance(x, str) and isinstance(y, list)):
y.append(x)
return y
return [x,y]
我得到的结果是:
samp.reduceByKey(lambda x,y : combine_strings(x,y)).collect()
[(1, ['TAGA', 'TGGA', 'ATGA', 'GTGT']), (2, ['GTAT', 'ATGT']), (3, 'TAAT'), (4, 'TAGC')]
我想要的是:
[(1,[' TAGA',' TGGA',' ATGA',' GTGT']),(2,[ ' GTAT',' ATGT']),(3,[' TAAT']),(4,[' TAGC'])]
一切都是数组。我无法判断pyspark是否在结果中调用combine_strings,其中包含1个条目,或者我是否可以告诉reduceByKey对单例结果执行某些操作?如何修改reduceByKey()或combine_strings函数以生成我喜欢的内容?
答案 0 :(得分:0)
您可以先将值映射到列表中,然后只组合这些列表:
samp.mapValues(lambda x : [x]).reduceByKey(lambda x,y : x + y).collect()
这里的问题是这些单身人士不受reduceByKey
的影响。这是另一个例子:
samp = sc.parallelize([(1,1),(2,2),(2,2),(3,3)])
>>> samp.reduceByKey(lambda x, y : x + y + 1).collect()
[(3, 3), (1, 1), (2, 5)]