如何在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)] 

我试图使用用户定义函数来标识与来自文本串分割相结合。但是,它抱怨在这种情况下附加功能是不可用的。

欣赏任何代码示例,这些代码示例将使我朝着正确的方向前进。

+0

源RDD是2列ID和txt元组?像这样的东西'[(1,'A B C'),(2,'A B C'),(1,'A B C')]'? –

以下片断应该工作

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数据帧的替代解决方案。主要是代码使用explodesplit拆分txt列。然后,使用groupbycount来计算配对的数量。

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