我有一个包含一列的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 ) )
} )
但是这段代码并没有给我正确的结果。
有人可以帮我这个吗?
答案 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