【问题标题】:How do I add values from a list into each item of an RDD?如何将列表中的值添加到 RDD 的每个项目中?
【发布时间】:2021-06-29 20:07:39
【问题描述】:

假设我有常规 python 列表 [1,2] 我有一个 rdd 有 2 个项目,例如 [('hi', 'bye'), ('hi', 'bye')] 我希望每个项目都成为

('hi', 'bye', 1)
('hi', 'bye', 2)

本质上是将列表中的每个项目附加到 rdd 中的每个项目。 我觉得这应该很简单,但我想不出逻辑:/

【问题讨论】:

    标签: python apache-spark pyspark apache-spark-sql rdd


    【解决方案1】:

    可以使用RDD的zip方法:

    rdd1 = sc.parallelize([('hi', 'bye'), ('hi', 'bye')])
    rdd2 = sc.parallelize([1, 2])
    
    rdd3 = rdd1.zip(rdd2).map(lambda x: (x[0][0], x[0][1], x[1]))
    
    rdd3.collect()
    # [('hi', 'bye', 1), ('hi', 'bye', 2)]
    

    【讨论】:

    • 很好,不过如果x[0][0] 是“嗨”,那么x[1] 不是[1,2] 的整个列表吗?是怎么分开的?
    • 因为经过压缩操作,rdd1和rdd2都是分开的。您可以查看rdd1.zip(rdd2).collect() 的结果以了解更多信息。
    【解决方案2】:

    尝试匹配模式

    a = [1,2]
    b = [('hi', 'bye'), ('hi', 'bye')]
    
    print([(x, y, z) for ((x, y), z) in zip(b, a)])
    

    输出:

    [('hi', 'bye', 1), ('hi', 'bye', 2)]
    

    【讨论】:

      【解决方案3】:

      我认为,这应该可以解决您的问题。 试试这个代码。

      your_list = [1,2]
      your_rdd = [('hi', 'bye'), ('hi', 'bye')]
      print([(x, y, z) for ((x, y), z) in zip(your_rdd, your_list)])
      

      说明:

      为简单起见,您可以使用str 元素。

      假设, 您有一个 RDD,并且每个项目都具有以下形式

      (key, [ele1, ele2, ele3, ..., elen])
      

      每个项目都是一个键值对,值是一个元素列表。

      你想解压列表,这样我就可以创建一个新的 RDD,每个项目都包含一个元素,如下所示:

      (key, ele1)
      (key, ele2)
      (key, ele3)
      .
      .
      .
      (key, ele4)
      

      像这样,为了简单起见,你可以使用 str 元素。

      >>> rdd = sc.parallelize([('key', ['ele1', 'ele2'])])
      >>> rdd.flatMap(lambda data: [(data[0], x) for x in data[1]]).collect()
      [('key', 'ele1'), ('key', 'ele2')]
      

      【讨论】:

        猜你喜欢
        • 2021-10-31
        • 2021-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多