将管道分隔文件转换为spark数据帧到CSV文件

时间:2016-04-29 22:31:10

标签: scala csv apache-spark spark-streaming rdd

我有一个包含一列的CSV文件,行的定义如下:

123 || food || fruit
123 || food || fruit || orange 
123 || food || fruit || apple

我想创建一个csv文件,其中包含单个列和不同的行值:

orange
apple

我尝试使用以下代码:

 val data = sc.textFile("fruits.csv")
 val rows = data.map(_.split("||"))
 val rddnew = rows.flatMap( arr => {
 val text = arr(0) 
 val words = text.split("||")
 words.map( word => ( word, text ) )
 } )

但是这段代码并没有给我正确的结果。
有人可以帮我这个吗?

2 个答案:

答案 0 :(得分:5)

你需要使用转义拆分特殊字符,因为split需要正则表达式

.split("\\|\\|")

转换为CSV非常棘手,因为数据字符串可能包含您的分隔符(引号),换行符或其他解析敏感字符,所以我建议使用spark-csv

 val df = sqlContext.read
  .format("com.databricks.spark.csv")
  .option("delimiter", "||")
  .option("header", "true")
  .option("inferSchema", "true")
  .load("words.csv")

 words.write
  .format("com.databricks.spark.csv")
  .option("delimiter", "||")
  .option("header", "true")
  .save("words.csv")

答案 1 :(得分:1)

你可以解决类似这个代码的问题

val text = sc.textFile("fruit.csv")
val word = text.map( l => l.split("\\|\\|")
val last = word.map( w => w(w.size - 1))
last.distinct.collect