如何在Word文本的唯一ID相关联火花
问题描述:
计数我有一个填充为如何在Word文本的唯一ID相关联火花
id txt
1 A B C
2 A B C
1 A B C
我的字数(pyspark)的结果的RDD应该是有关联的字符串和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)]
我试图使用用户定义函数来标识与来自文本串分割相结合。但是,它抱怨在这种情况下附加功能是不可用的。
欣赏任何代码示例,这些代码示例将使我朝着正确的方向前进。
答
以下片断应该工作
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)]
答
下面是使用PySpark数据帧的替代解决方案。主要是代码使用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)]
源RDD是2列ID和txt元组?像这样的东西'[(1,'A B C'),(2,'A B C'),(1,'A B C')]'? –