使用spark从数据中删除管道分隔符

时间:2016-08-02 14:12:55

标签: scala apache-spark

我是新来的火花,我使用scala来分隔管道分隔文件并保存在没有管道分隔的hdfs中,因为我已经编写了这段代码。

object WordCount {
 def main(args: Array[String])
 {
 val textfile = sc.textFile("/user/cloudera/xxxx/xxxx")
 val word = textfile.map( l => l.split("|"))
 word.saveAsTextFile("/user/cloudera/xxxxx/Sparktest")
 }
} 

但是当我执行它时,我没有收到任何错误,但在我的hdfs中,我得到的数据低于数据。

[Ljava.lang.String;@10ed847f
[Ljava.lang.String;@4316ebe
[Ljava.lang.String;@495d7e18
[Ljava.lang.String;@19017f49
[Ljava.lang.String;@314b9e72
[Ljava.lang.String;@5b8f67a6
[Ljava.lang.String;@23ddf240
[Ljava.lang.String;@404b5a25
[Ljava.lang.String;@130b541d
[Ljava.lang.String;@4cbf45af
[Ljava.lang.String;@21780b86
[Ljava.lang.String;@503c9b94
[Ljava.lang.String;@3b0a3ab3

我不知道我做错了什么。 请帮忙

1 个答案:

答案 0 :(得分:3)

那是因为你将每个字符串拆分成一个字符串数组。要保存为文本文件,如果要与逗号连接,则需要使用mkString(",")。但我没有看到任何目的。

如果您想用逗号替换管道分隔符,可以使用_.replaceAll("|",",")代替并保存:

val word = textfile.map(_.replaceAll("\\|",",").replaceFirst(",","").trim)
word.saveAsTextFile("/user/cloudera/xxxxx/Sparktest")

PS:您可以将逗号替换为您想要的任何内容,例如空格,单词等。

所以 为什么管道需要转义?

  

字符串拆分需要正则表达式参数。一个未转义的|被解析为正则表达式,意思是“空字符串或空字符串”,这不是你的意思。