【问题标题】:create RDD using pyspark where key is the first field of the record and the value is the entire record使用 pyspark 创建 RDD,其中键是记录的第一个字段,值是整个记录
【发布时间】:2018-03-26 20:16:41
【问题描述】:

我们如何使用 pyspark 创建一个 RDD,其中键是记录的第一个字段,值是整个记录?

(u'Joe', u'44', 21, u'41', u'1‘, u’1’),
(u‘Mel', u'13', 3, u'30', u'50‘, u’6’)
...

(u’Joe’, (u'Joe', u'44', 21, u'41', u'1‘, u’1’)),
(u’Mel’, (u‘Mel', u'13', 3, u'30', u'50‘, u’6’))
...

【问题讨论】:

  • 显示你尝试过的东西...
  • 我是 spark 新手,但这些是我尝试的以下命令。 rdd2 = rdd1.groupByKey()
  • rdd2 = rdd1.reduceByKey(lambda (x,y): [x[0],x[1],x[2],x[3],x[4],x[5 ]])
  • 你的最终目标是什么?为什么需要这样的键值对?

标签: apache-spark pyspark


【解决方案1】:

你可以使用pyspark.rdd.keyBy():

>>> rdd = sc.parallelize([('Joe', '44', 21,'41','1','1'),('Mel', '13', 3, '30', '50', '6')])

>>> rdd.keyBy(lambda r: r[0]).collect()
[('Joe', ('Joe', '44', 21, '41', '1', '1')), ('Mel', ('Mel', '13', 3, '30', '50', '6'))]

【讨论】:

  • 我有一个包含 1000 条记录的文本文件。如乔、44、21、41、1、1 等。我使用 rdd0 = sc.textFile("somefile.txt") 然后使用 rdd1 = rdd0.map(lambda line:line.split(",")) 现在我想创建密钥对。希望您理解这一点,上述解决方案对我不起作用。
  • 你试过rdd1 = rdd0.map(lambda line:line.split(",")).keyBy(lambda r: r[0])吗?
  • 据我研究,转换包括reduceByKey或groupByKey等。是否有任何关于 keyBy 转换的文档?
  • @yatinsingla,我编辑了 Bala 的答案以包含指向文档的链接。请考虑删除您发布的答案,因为它与此答案相同。如果您愿意,请将其添加为评论。
  • 当然,感谢您让我意识到这一点。第一次发帖,不知道怎么回复
【解决方案2】:

你可以使用map函数如下

rdd.map(lambda row: (row[0], row))

【讨论】:

    猜你喜欢
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多