如何通过从现有 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
第一步,我通过下面的代码创建一个 RDD
和 RDD[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" }
我有一个场景可以从现有 RDD
中捕获一些数据(不是全部),然后将其传递给其他 Scala class
以进行实际操作。让我们看看文本文件中的示例数据(empnum、empname、emplocation、empsal)。
11,John,Paris,1000
12,Daniel,UK,3000
第一步,我通过下面的代码创建一个 RDD
和 RDD[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" }