【问题标题】:count the lines in rdd depended on the lines context, pyspark计算 rdd 中的行数取决于行上下文,pyspark
【发布时间】:2016-07-15 15:17:30
【问题描述】:

我目前试图了解 RDD 是如何工作的。例如,我想根据某个 RDD 对象中的上下文来计算行数。我对 DataFrames 和我的 DF 代码有一些经验,例如列 AB 和可能的其他一些列,看起来像:

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

我执行映射操作并从键 AB 创建值的元组。唯一行不再有任何键(这是与具有列名的 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


【解决方案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 是字符串的情况。如果它们是列表,则必须创建“主键”类型的对象来执行归约。您不能在主键是一些复杂对象的情况下执行 reduceByKey

【讨论】:

  • 感谢您的回复。实际上我已经找到了解决方案,但没有在这里公开。你几乎是对的,我将键创建为(A 和 B 值的唯一组合,但使用 countByKey 作为最终函数。无论如何非常感谢您
  • 您应该发布您的解决方案,以便其他人可以使用它。
  • @Katya Handler,我不得不说,经过一些测试,我必须确认使用 reduceByKey() 的解决方案比 countByKey() 更有效。我不需要创建列表并使用 sc.parallelize(),直接创建 rdd 会好得多。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
相关资源
最近更新 更多