如何通过从现有 RDD 中选择特定数据来创建 RDD,其中输出应为 RDD [String]?

How to create an RDD by selecting specific data from an existing RDD where output should of RDD[String]?

我有一个场景可以从现有 RDD 中捕获一些数据(不是全部),然后将其传递给其他 Scala class 以进行实际操作。让我们看看文本文件中的示例数据(empnum、empname、emplocation、empsal)。

11,John,Paris,1000
12,Daniel,UK,3000 

第一步,我通过下面的代码创建一个 RDDRDD[String]

val empRDD = spark
  .sparkContext
  .textFile("empInfo.txt")

因此,我的要求是使用 empnum、empname、emplocation(再次使用 RDD[String])创建另一个 RDD。 为此,我尝试了下面的代码,因此我得到 RDD[String, String, String].

val empReqRDD = empRDD
  .map(a=> a.split(","))
  .map(x=> (x(0), x(1), x(2)))

我也尝试过 Slice,它给了我 RDD[Array(String)]。 我需要的 RDD 应该是 RDD[String] 传递给需要的 Scala class 来做一些操作。

预期的输出应该是,

11,John,Paris
12,Daniel,UK

谁能帮我实现一下?

我会试试这个

val empReqRDD = empRDD
  .map(a=> a.split(","))
  .map(x=> (x(0), x(1), x(2)))

val rddString = empReqRDD.map({case(id,name,city) => "%s,%s,%s".format(id,name,city)}) 

在您的初始实现中,第二个映射将数组元素放入一个三元组中,因此 RDD[(String, String, String)].

完成 objective 的一种方法是更改​​第二个映射以构造如下字符串:

empRDD
  .map(a=> a.split(","))
  .map(x => s"${x(0)},${x(1)},${x(2)}")

或者,更简洁一点,您可以通过获取数组的前 3 个元素并使用 mkString 方法来实现:

empRDD.map(_.split(',').take(3).mkString(","))

对于这个用例来说可能有点矫枉过正,但您也可以使用正则表达式来提取值:

val r = "([^,]*),([^,]*),([^,]*).*".r
empRDD.map { case r(id, name, city) => s"$id,$name,$city" }