计算rdd中依赖于行上下文的行,pyspark

时间:2016-03-28 11:07:16

标签: python apache-spark rdd spark-dataframe

我目前试着了解RDD的工作原理。例如,我想根据某些RDD对象中的上下文来计算行数。我对DataFrames以及我的DF代码有一些了解,例如列AB以及其他一些列,看起来像:

df = sqlContext.read.json("filepath")
df2 = df.groupBy(['A', 'B']).count()

这段代码的逻辑部分对我来说很清楚 - 我在DF中对列名进行groupBy操作。在RDD中,我没有一些列名,只有相似的行,可以是元组或行对象......我如何计算类似的元组并将其作为整数添加到唯一的行?例如,我的第一个代码是:

df = sqlContext.read.json("filepath") 
rddob = df.rdd.map(lambda line:(line.A, line.B))

我执行地图操作并根据键AB创建值的元组。唯一行不再具有任何键(这与具有列名称的DataFrame最重要的区别)。 现在我可以生成这样的东西,但它只计算RDD中的总行数。

rddcalc = rddob.distinct().count()

我想要的输出只是:

((a1, b1), 2)
((a2, b2), 3)
((a2, b3), 1)
...

PS

我找到了这个问题的个人解决方案。这里:rdd是初始的rdd,rddlist是所有行的列表,rddmod是最终修改的rdd,因此是解决方案。

rddlist = rdd.map(lambda line:(line.A, line.B)).map(lambda line: (line, 1)).countByKey().items()
rddmod = sc.parallelize(rddlist)

1 个答案:

答案 0 :(得分:1)

我相信你在这里寻找的是reduceByKey。这将为您计算每对不同的(a,b)行出现的次数。 它看起来像这样:

rddob = df.rdd.map(lambda line: (line.A + line.B, 1))
counts_by_key = rddob.reduceByKey(lambda a,b: a+b)

您现在将拥有表单的键值对: ((a,b), count-of-times-pair-appears)

请注意,这仅适用于A和B为字符串的情况。如果它们是列表,则必须创建“主键”类型的对象以执行reduce。您无法执行主键是某个复杂对象的reduceByKey