【问题标题】:pyspark join two rdds and flatten the resultspyspark 加入两个 rdds 并将结果展平
【发布时间】:2018-10-16 02:00:36
【问题描述】:

环境是 pyspark,Spark 版本 2.2。

我们有两个 rdds test1test2,下面是示例数据

test1 = [('a', 20), ('b', 10), ('c', 2)]
test2 = [('a', 2), ('b', 3)]

现在我们要生成output1,如下所示,感谢您的帮助。

[('a', 20, 2), ('b', 10, 3)]

【问题讨论】:

  • 您是要获取出现次数还是只是在两个 rdd 之间进行连接?

标签: pyspark rdd


【解决方案1】:

您可以通过简单的join 来完成此操作,然后调用map 以展平值。

test1.join(test2).map(lambda (key, values): (key,) + values).collect()
#[('a', 20, 2), ('b', 10, 3)]

解释一下,join的结果如下:

test1.join(test2).collect()
#[('a', (20, 2)), ('b', (10, 3))]

这几乎是所需的输出,但您希望使结果变平。我们可以通过调用map 并返回具有所需格式的新tuple 来完成此操作。语法 (key,) 将创建一个只有键的单元素元组,我们将其添加到值中。

您还可以使用 DataFrame API,通过使用pyspark.sql.DataFrame.toDF() 将您的 RDD 转换为 DataFrame:

test1.toDF(["key", "value1"]).join(test2.toDF(["key", "value2"]), on="key").show()
#+---+------+------+
#|key|value1|value2|
#+---+------+------+
#|  b|    10|     3|
#|  a|    20|     2|
#+---+------+------+

【讨论】:

  • 但是,'c' 呢?
  • @Prazy 这是一个内部连接。 test2 中没有 'c'
  • 哦,是的。 :) 好兄弟。
猜你喜欢
  • 2017-09-06
  • 2017-08-06
  • 2016-03-25
  • 1970-01-01
  • 2015-06-04
  • 2020-10-25
  • 1970-01-01
  • 2015-09-05
  • 1970-01-01
相关资源
最近更新 更多