String Spark-Rdd管柱清洁/操作

String Spark-Rdd管柱清洁/操作,string,scala,dictionary,apache-spark,rdd,String,Scala,Dictionary,Apache Spark,Rdd,我有一个spark.rdd.rdd[String]MapPartition,它是我用过滤器创建的 val myMapPartition = myTextFile.filter(_.split("\t")(2) == "\"red\"") 此筛选器使用制表符分隔我的文本文件行,并检查结果数组的第二个元素是否等于“red” myMapPartition.collect()返回类型为String的Array。以下是一个例子: 24344 "someString" "red" 23421 "someO

我有一个
spark.rdd.rdd[String]MapPartition
,它是我用过滤器创建的

val myMapPartition = myTextFile.filter(_.split("\t")(2) == "\"red\"")
此筛选器使用制表符分隔我的文本文件行,并检查结果数组的第二个元素是否等于“red”

myMapPartition.collect()
返回类型为
String
Array
。以下是一个例子:

24344 "someString" "red"
23421 "someOtherString" "red"
我正在尝试对字符串执行一些编辑。最后,我考虑了一些字符串替换逻辑,但我尝试先连接一个字符串。所以我会寻找这样的东西:

24344 "someString hello" "red"
23421 "someOtherString hello" "red"
我试图使用
地图
来完成这项工作:

val myCleanRdd = myMapPartition.map(_1 => (_1.concat(" hello")))
然而,我最终得到了:

24344 "someString" "red" hello
23421 "someOtherString" "red" hello
我的问题是如何操作rdd行的某些元素?我认为问题在于我的行被认为是一个
字符串。我不知道如何正确地映射这一点,使我能够专注于各个领域


免责声明:Scala/Spark noob

您首先需要将
split
映射到原始RDD的每个元素上,因此最终得到的是
RDD[Array[String]
而不是
RDD[String]
,例如

myTextFile.map(_.split("\t")).filter(_(2) == "\"red\"")
rdd.foreach(_.foreach(println))
目前,您正在使用
split
来过滤字符串的输入RDD,但这只会创建字符串的输出RDD,放弃了您对
split
所做的工作

然后,如果RDD的每个元素都是一个已知长度的
数组[String]
,则可以使用模式匹配(使用
大小写
关键字)来
映射
,以提取和修改单个元素,例如:

rdd.map { case Array(x, y, z) => Array(x, y + " hello", z) }
(请注意,使用此方法时,必须在
映射
函数周围使用大括号
{}
,而不是括号
()
)。类似的模式匹配可以用于列表、元组、向量等行

更新:如果您想用处理过的版本替换其中一个元素,这是类似的模式,例如

rdd.map { case Array(x, y, z) => Array(x, y.replace("s","x"), z) }
要打印出
RDD[Array[String]]
的所有元素,您可以执行嵌套的
foreach
,例如

myTextFile.map(_.split("\t")).filter(_(2) == "\"red\"")
rdd.foreach(_.foreach(println))
由于重载方法(通常使用
Arrays.toString
,但在Scala中使用)的缘故,将每一行打印为一个数组比预期的要复杂,但可以按如下方式进行:

rdd.foreach(row => println(row.mkString("[",",","]")))

首先需要在原始RDD的每个元素上映射
split
,因此最终得到的是
RDD[Array[String]]
,而不是
RDD[String]
,例如

myTextFile.map(_.split("\t")).filter(_(2) == "\"red\"")
rdd.foreach(_.foreach(println))
目前,您正在使用
split
来过滤字符串的输入RDD,但这只会创建字符串的输出RDD,放弃了您对
split
所做的工作

然后,如果RDD的每个元素都是一个已知长度的
数组[String]
,则可以使用模式匹配(使用
大小写
关键字)来
映射
,以提取和修改单个元素,例如:

rdd.map { case Array(x, y, z) => Array(x, y + " hello", z) }
(请注意,使用此方法时,必须在
映射
函数周围使用大括号
{}
,而不是括号
()
)。类似的模式匹配可以用于列表、元组、向量等行

更新:如果您想用处理过的版本替换其中一个元素,这是类似的模式,例如

rdd.map { case Array(x, y, z) => Array(x, y.replace("s","x"), z) }
要打印出
RDD[Array[String]]
的所有元素,您可以执行嵌套的
foreach
,例如

myTextFile.map(_.split("\t")).filter(_(2) == "\"red\"")
rdd.foreach(_.foreach(println))
由于重载方法(通常使用
Arrays.toString
,但在Scala中使用)的缘故,将每一行打印为一个数组比预期的要复杂,但可以按如下方式进行:

rdd.foreach(row => println(row.mkString("[",",","]")))

正是我要找的!两件事:您能讨论一下如何将此模式应用于stringReplace功能吗?另外,一旦我得到原始红色的
Array[String]
,我如何打印它?现在我只看到内存地址?谢谢正是我要找的!两件事:您能讨论一下如何将此模式应用于stringReplace功能吗?另外,一旦我得到原始红色的
Array[String]
,我如何打印它?现在我只看到内存地址?谢谢