【发布时间】:2016-07-15 15:17:30
【问题描述】:
我目前试图了解 RDD 是如何工作的。例如,我想根据某个 RDD 对象中的上下文来计算行数。我对 DataFrames 和我的 DF 代码有一些经验,例如列 A、B 和可能的其他一些列,看起来像:
df = sqlContext.read.json("filepath")
df2 = df.groupBy(['A', 'B']).count()
这段代码的逻辑部分对我来说很清楚——我对 DF 中的列名执行groupBy 操作。在 RDD 中,我没有一些列名,只有类似的行,可能是一个元组或一个 Row 对象......我如何计算类似的元组并将其作为整数添加到唯一行?例如我的第一个代码是:
df = sqlContext.read.json("filepath")
rddob = df.rdd.map(lambda line:(line.A, line.B))
我执行映射操作并从键 A 和 B 创建值的元组。唯一行不再有任何键(这是与具有列名的 DataFrame 最重要的区别)。
现在我可以生成这样的东西,但它只计算 RDD 中的总行数。
rddcalc = rddob.distinct().count()
我想要的输出只是:
((a1, b1), 2)
((a2, b2), 3)
((a2, b3), 1)
...
附言
我已经为这个问题找到了我的个人解决方案。这里: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)
【问题讨论】:
-
事实上
groupBy并不推荐,因为它需要对分区进行洗牌,因此在所有节点之间移动了许多数据。 -
@Alberto Bonsanto,感谢您对此主题的兴趣。我不认为 groupBy 对 DF 是危险的,对于 RDD 它不存在。
-
你可以在这里找到 databricks 解释的一些原因 Prefer reduceByKey over groupByKey
-
好的,谢谢,有趣的文章
-
嗨@Guforu,我已阅读此消息几次,但我仍然不明白您要实现的目标。您想要特定元组组合出现在您的 RDD 中的次数吗?
标签: python apache-spark rdd spark-dataframe