2016-04-29 60 views
1

我有一個CSV與一個單塔文件和行被定義如下:轉換管分隔的文件火花數據幀到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

你需要轉義特殊字符分割,因爲分裂發生的正則表達式

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

轉換爲CSV是棘手,因爲數據字符串可能潛在地包含定界符(引號),新線或其他parse-敏感字符,所以我推薦使用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") 
+0

是的謝謝你,它的工作。 – user2122466

+0

如何添加|^|火花csv輸出分隔符? – SUDARSHAN

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 
+0

謝謝。它的工作,但我也想保存爲csv文件的結果。我試着做last.distinct.collect.saveAsTextFile(),但它不起作用,指出saveAsTextFile不是Array [String]的成員。你能幫我解決嗎? – user2122466

+0

@ user2122466'saveAsTextFile'在RDD上定義。什麼是'last.distinct.collect'類型? – maasg

+0

@maasg:它是一個數組[字符串]。謝謝你。 – user2122466