add*_*ons 3 scala apache-spark rdd
我有一个rdd,RDD的结构如下:
org.apache.spark.rdd.RDD[(String, Array[String])] = MappedRDD[40] at map at <console>:14
Run Code Online (Sandbox Code Playgroud)
这x.take(1)看起来像:
Array[(String, Array[String])] = Array((8239427349237423,Array(122641|2|2|1|1421990315711|38|6487985623452037|684|, 1229|2|1|1|1411349089424|87|462966136107937|1568|.....))
Run Code Online (Sandbox Code Playgroud)
对于数组中的每个字符串,我想用"|"拆分 并获取第6项并使用元组的第一个元素返回它,如下所示:
8239427349237423-6487985623452037
8239427349237423-4629661361079371
Run Code Online (Sandbox Code Playgroud)
我开始如下:
def getValues(lines: Array[String]) {
for(line <- lines) {
line.split("|")(6)
}
Run Code Online (Sandbox Code Playgroud)
我也试过以下:
val b= x.map(a => (a._1, a._2.flatMap(y => y.split("|")(6))))
Run Code Online (Sandbox Code Playgroud)
但最终给了我以下内容:
Array[(String, Array[Char])] = Array((8239427349237423,Array(1, 2, 4, |, 9, |, 4, 1, 7, 6, |, 2, 9, 2, 7, 2, |, 7, |,....)))
Run Code Online (Sandbox Code Playgroud)
如果你想要整体做到这一点,x你可以使用flatMap:
def getValues(x: Array[(String, Array[String])]) =
x flatMap (line => line._2 map (line._1 + "-" + _.split("\\|")(6)))
Run Code Online (Sandbox Code Playgroud)
或者,也许更清楚一点,理解:
def getValues(x: Array[(String, Array[String])]) =
for {
(fst, snd) <- x
line <- snd
} yield fst + "-" + line.split("\\|")(6)
Run Code Online (Sandbox Code Playgroud)
你必须split使用"\\|"参数调用,因为它采用正则表达式并且|是一个特殊符号,因此你需要转义它.(编辑:或者您可以使用'|'(a Char),如@BenReich所建议的那样)
要回答您的评论,您可以修改getValues以将单个元素x作为参数:
def getValues(item: (String, Array[String])) =
item._2 map (item._1 + "-" + _.split('|')(6))
Run Code Online (Sandbox Code Playgroud)
然后用它来调用它
x flatMap getValues
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4379 次 |
| 最近记录: |