我有一个填充为
的RDDid txt
1 A B C
2 A B C
1 A B C
我的单词计数(pyspark)的结果应该是与它相关联的字符串和id的组合。例如:
[(u'1_A',2), (u'1_B',2), (u'1_C',2),(u'2_A',1),(u'2_B',1),(u'2_C',1)]
我尝试使用用户定义的函数将id与来自文本的字符串拆分相结合。但是,它抱怨在这种情况下附加功能不可用。
感谢任何能让我朝着正确方向前进的代码示例。
答案 0 :(得分:0)
以下代码段应该可以使用
rdd = sc.parallelize([(1,'A B C'), (2, 'A B C'), (1,'A B C')])
result = rdd \
.map(lambda x: (x[0],x[1].split(' '))) \
.flatMap(lambda x: [ '%s_%s'% (x[0],y) for y in x[1] ]) \
.map(lambda x: (x,1)) \
.reduceByKey(lambda x,y: x + y)
result.collect()
<强>输出强>
[('1_C', 2), ('1_B', 2), ('1_A', 2), ('2_A', 1), ('2_B', 1), ('2_C', 1)]
答案 1 :(得分:0)
这是使用PySpark Dataframe的替代解决方案。主要是,代码使用explode
和split
来拆分txt
列。然后,使用groupby
和count
计算对数。
import pyspark.sql.functions as func
rdd = spark.sparkContext.parallelize([(1,'A B C'), (2, 'A B C'), (1,'A B C')])
df = rdd.toDF(['id', 'txt'])
df_agg = df.select('id', func.explode(func.split('txt', ' '))).\
groupby(['id', 'col']).\
count().\
sort(['id', 'col'], ascending=True)
df_agg.rdd.map(lambda x:(str(x['id']) + '_' + x['col'], x['count'] )).collect()
<强>输出强>
[('1_A', 2), ('1_B', 2), ('1_C', 2), ('2_A', 1), ('2_B', 1), ('2_C', 1)]