[英]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
第一步,我通过下面的代码用RDD[String]
创建一个RDD
,
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 以执行一些操作。
预期的 output 应该是,
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)})
在您的初始实现中,第二个 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(","))
对于这个用例可能有点矫枉过正,但您也可以使用正则表达式来提取值:
val r = "([^,]*),([^,]*),([^,]*).*".r
empRDD.map { case r(id, name, city) => s"$id,$name,$city" }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.