2017-06-02 53 views
0

計數我有一個填充爲如何在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')]'? –

回答

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

下面是使用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)]