【问题标题】:How to create Map using multiple lists in Spark如何在 Spark 中使用多个列表创建地图
【发布时间】:2016-08-23 10:45:42
【问题描述】:

我正在尝试通过以下示例条目了解如何从 RDD myRDD 访问特定元素:

(600,List((600,111,7,1), (615,111,3,5))
(601,List((622,112,2,1), (615,111,3,5), (456,111,9,12))

我想使用子列表中的第三个字段作为 ID 从 Redis DB 中提取一些数据。例如,对于(600,List((600,111,1,1), (615,111,1,5)),ID 为73。 对于(601,List((622,112,2,1), (615,111,3,5), (456,111,9,12)),ID 为239

问题是我不知道如何使用多个 ID 收集值。在下面给定的代码中,我使用了line._2(3),但这不正确,因为这样我访问的是子列表而不是这些子列表中的字段。 我应该使用flatMap 还是类似的?

  val newRDD = myRDD.mapPartitions(iter => {
    val redisPool = new Pool(new JedisPool(new JedisPoolConfig(), "localhost", 6379, 2000))
    iter.map({line => (line._1,
      redisPool.withJedisClient { client =>
        val start_date: String = Dress.up(client).hget("id:"+line._2(3),"start_date")
        val end_date: String = Dress.up(client).hget("id:"+line._2(3),"end_date")
        val additionalData = List((start_date,end_date))
        Map(("base_data", line._2), ("additional_data", additionalData))
      })
    })
  })
  newRDD.collect().foreach(println)

如果我们假设 Redis DB 包含一些相关数据,那么结果newRDD 可能如下:

(600,Map("base_data" -> List((600,111,7,1), (615,111,3,5)), "additional_data" -> List((2014,2015),(2015,2016)))
(601,Map("base_data" -> List((622,112,2,1), (615,111,3,5), (456,111,9,12)), "additional_data" -> List((2010,2015),(2011,2016),(2014,2016)))

【问题讨论】:

    标签: scala apache-spark rdd


    【解决方案1】:

    要获取line._2 中每个元组的第三个元素的列表,请使用line._2.map(_._3)(假设line 的类型为(Int, List[(Int, Int, Int, Int)]),就像从您的示例中看到的那样,而Any 之类的类型则不是t 参与)。总体而言,您的代码看起来应该是这样的

    iter.map({ case (first, second) => (first,
      redisPool.withJedisClient { client =>
        val additionalData = second.map { tuple =>
          val start_date: String = Dress.up(client).hget("id:"+tuple._3,"start_date")
          val end_date: String = Dress.up(client).hget("id:"+tuple._3,"end_date")
          (start_date, end_date)
        }
        Map(("base_data", second), ("additional_data", additionalData))
      })
    })
    

    【讨论】:

      猜你喜欢
      • 2015-09-27
      • 2020-09-22
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      • 1970-01-01
      • 2016-09-23
      相关资源
      最近更新 更多