如何通过从现有rdd中选择特定数据来创建rdd,其中输出应该是rdd[string]的一部分?

eblbsuwk  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(281)

我有一个场景可以从现有的 RDD 然后把它传给其他人 Scala class 用于实际操作。让我们看看文本文件中的示例数据(empnum、empname、emposition、empsal)。

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

第一步,我创建一个 RDDRDD[String] 按以下代码,

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

所以,我的要求是创建另一个 RDD 使用empnum,empname,emposition(再次使用 RDD[String] ). 为此,我尝试了下面的代码,因此我得到 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类以执行某些操作。
预期输出应该是,

11,John,Paris
12,Daniel,UK

有人能帮我实现吗?

bttbmeg0

bttbmeg01#

我想试试这个

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)})
x8diyxa7

x8diyxa72#

在最初的实现中,第二个Map将数组元素放入一个3元组中,因此rdd[(string,string,string)]。
实现目标的一种方法是更改第二个Map以构造如下所示的字符串:

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

或者,更简洁一点的方法是,获取数组的前3个元素并使用mkstring方法:

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

对于这个用例,可能有点过头了,但是您也可以使用regex来提取值:

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

相关问题