【问题标题】:Spark: Extract Values from Output RDDSpark:从输出 RDD 中提取值
【发布时间】:2022-01-04 10:27:33
【问题描述】:

我是 Spark 编程的新手。我正在尝试从 RDD 中提取值,因为我从 RDD 获得了以下输出

(CBI10006,(Some(Himanshu Vasani),None))
(CBI10004,(Some(Sonam Petro),Some(8500)))
(CBI10003,(None,Some(3000)))

我想把上面的值提取到下面一个

(CBI10006,Himanshu Vasani,'')
(CBI10004,Sonam Petro,8500)
(CBI10003,'',3000)

我已经尝试了下面的 FlatMap 方法

joined.flatMap{case(f1,f2) => (f1,(f2._1,f2._2))} but getting a below error

type mismatch;
 found   : (String, (Option[String], Option[String]))
 required: TraversableOnce[?]
    **joined.flatMap{case(f1,f2) => (f1,(f2._1,f2._2))}**

【问题讨论】:

  • 在你的情况下,地图可以工作,除非你想要一个 RDD[List[String]] 作为结果
  • 我很确定你可以直接打电话给values
  • @LuisMiguelMejíaSuárez 使用 flatMap?
  • @DhrumilShah 不,我的意思是你可以在joined 上拨打values 来获得你想要的答案。

标签: scala apache-spark rdd flatmap


【解决方案1】:

使用map()

val data = Seq(("CBI10006", (Some("Himanshu Vasani"), None)), ("CBI10004", (Some("Sonam Petro"), Some(8500))),
  ("CBI10003", (None, Some(3000))))
    
spark.sparkContext
  .parallelize(data)
  .map { case (x, y) => (x, y._1.getOrElse(""), y._2.getOrElse("")) }
  .foreach(println)

// output: 
// (CBI10006,Himanshu Vasani,)
// (CBI10004,Sonam Petro,8500)
// (CBI10003,,3000)

【讨论】:

  • 感谢@Gabib,它正在工作......但只是为了理解你能建议我使用 flatMap 选项吗?
  • @DhrumilShah 使用flatMap 进行一对一映射毫无意义。为什么要使用它?
  • 好的,谢谢...
猜你喜欢
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
  • 2016-05-14
  • 2017-10-14
  • 2020-05-08
  • 1970-01-01
相关资源
最近更新 更多