如何使用自定义分隔符读取Spark中的新行和列的文件(Scala)

时间:2017-01-12 16:52:03

标签: scala apache-spark apache-spark-sql

使用新行分隔符作为"^*~"和列分隔符作为"^|&"读取文本文件的最佳方法是什么。我有一个超过100的大量列的文件。请建议有效的方法。下面是几个字段的文件。

我有一个像

这样的文件
abcd^|&cdef^|&25^|&hile^|&12345^*~xyxxx^|&zzzzz^|&70^|&dharan^|&6567576

我希望这个文件像

fname   lname   age address phone 
abcd    cdef    25  abc     1234523
xyxxx   zzzzz   70  xyz     6567576

1 个答案:

答案 0 :(得分:3)

你需要使用分隔符的转义字符进行flatMap和split,以便创建行,然后使用相同的方法拆分第二个分隔符,然后模式匹配以获取元组:

val str = "abcd^|&cdef^|&25^|&hile^|&12345^*~xyxxx^|&zzzzz^|&70^|&dharan^|&6567576"
val rdd = sc.parallelize(Seq(str))
val rdd2 = rdd.flatMap(_.split("\\^\\*~")).map(_.split("\\^\\|\\&") match {
   case Array(a, b, c, d, e) => (a, b, c, d, e)
})

rdd2.toDF("fname","lname","age","address","phone").show
// +-----+-----+---+-------+-------+                                               
// |fname|lname|age|address|  phone|
// +-----+-----+---+-------+-------+
// | abcd| cdef| 25|   hile|  12345|
// |xyxxx|zzzzz| 70| dharan|6567576|
// +-----+-----+---+-------+-------+