繁体   English   中英

如何通过从现有 RDD 中选择特定数据来创建 RDD,其中 output 应该是 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 

第一步,我通过下面的代码用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM