【问题标题】:How to create an RDD by selecting specific data from an existing RDD where output should of RDD[String]?如何通过从现有 RDD 中选择特定数据来创建 RDD,其中输出应为 RDD[String]?
【发布时间】:2020-08-24 04:25:59
【问题描述】:

我有一个场景从现有的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")

所以,我的要求是创建另一个 RDD,使用 empnum、empname、emplocation(再次使用 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

谁能帮我实现?

【问题讨论】:

  • 你可以尝试连接字符串并在你的第二个地图中返回,这将返回一个单一的字符串。或者您可以使用元组 3。
  • 如果你觉得这很有用,你可以点击“评论添加对这篇文章有用的东西”按钮吗?

标签: scala apache-spark string-formatting rdd


【解决方案1】:

我会试试这个

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

【讨论】:

    【解决方案2】:

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

    实现目标的一种方法是更改​​第二个映射以构造如下字符串:

    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" }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-11
      • 1970-01-01
      • 1970-01-01
      • 2015-12-11
      • 2021-10-16
      • 2017-02-17
      • 1970-01-01
      • 2021-04-08
      相关资源
      最近更新 更多