如何使用spark

时间:2017-06-02 20:21:27

标签: apache-spark rdd

我有一个填充为

的RDD
id              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与来自文本的字符串拆分相结合。但是,它抱怨在这种情况下附加功能不可用。

感谢任何能让我朝着正确方向前进的代码示例。

2 个答案:

答案 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的替代解决方案。主要是,代码使用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)]