解析并连接两列

时间:2016-01-18 14:15:24

标签: scala parsing concatenation

我正在尝试使用以下表达式同时解析和连接两个列:

val part : RDD[(String)] = sc.textFile("hdfs://xxx:8020/user/sample_head.csv")
                    .map{line => val row = line split ','
                    (row(1), row(2)).toString}

返回类似的内容:

Array((AAA,111), (BBB,222),(CCC,333))

但我怎么能直接得到:

Array(AAA, 111 , BBB, 222, CCC, 333)

1 个答案:

答案 0 :(得分:1)

元组上的toString()对我来说真的没什么意义。你能解释一下为什么要从元组创建字符串然后再将它们拆分?

如果您愿意将每一行映射到元素列表而不是字符串化的元素元组,则可以重写

(row(1), row(2)).toString

List(row(1), row(2))

并简单地展平结果列表:

val list = List("0,aaa,111", "1,bbb,222", "2,ccc,333")

val tuples = list.map{ line => 
  val row = line split ','
  List(row(1), row(2))}

val flattenedTuples = tuples.flatten

println(flattenedTuples) // prints List(aaa, 111, bbb, 222, ccc, 333)

请注意,您尝试实现的内容涉及展平,可以使用flatMap完成,但不能仅使用map。你需要直接使用flatMap,或者像我向你展示的那样做地图然后展平(我老实说不记得Spark是否支持flatMap)。另外,正如您所看到的,我使用List作为更惯用的Scala数据结构,但它可以轻松转换为Array,反之亦然。