2017-09-25 50 views
2

我有其中有一些多線觀察一個數據幀:如何處理火花多行的行?

+--------------------+----------------+ 
|   col1|    col2| 
+--------------------+----------------+ 
|something1   |somethingelse1 | 
|something2   |somethingelse2 | 
|something3   |somethingelse3 | 
|something4   |somethingelse4 | 
|multiline 

row    |  somethings| 
|something   |somethingall | 

我要的是在csv格式(或txt)這個數據幀進行保存。使用以下內容:

df 
.write 
.format("csv") 
.save("s3://../adf/") 

但是,當我檢查文件時,它將觀察結果分離爲多行。我想要的是具有'多行'觀察值的行在txt/csv文件中是同一行。我試圖將其保存爲txt文件:

df 
.as[(String,String)] 
.rdd 
.saveAsTextFile("s3://../adf") 

但是觀察到相同的輸出。

我可以想象,一種方法是用其他東西替換\n,並且在加載後執行反轉功能後。但是有沒有一種方法可以在不對數據進行任何形式的轉換的情況下以預期的方式進行保存?

回答

2

默認情況下,如果sparkTextFile遇到\ n,它會考慮另一行。這與csv相同。在csv閱讀中,您可以使用選項(「分隔符」,「\ t」)指定分隔符。

在我看來,閱讀多行輸入的最好方法是通過hadoopAPI。您可以指定自己的分隔符並處理數據。

事情是這樣的:

import org.apache.hadoop.io.LongWritable 
import org.apache.hadoop.io.Text 
import org.apache.hadoop.conf.Configuration 
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat 

val conf = new Configuration 
conf.set("textinputformat.record.delimiter", "<your delimiter>") 
val data: RDD[(LongWritable, Text)] =spark.sparkContext.newAPIHadoopFile(<"filepath">, classOf[TextInputFormat], classOf[LongWritable], classOf[Text], conf) 

在這裏,在數據文本是你的分隔符分隔字符串

1

假設多行數據被正確引用,您可以使用單義解析多行CSV數據解析器和多線設置

sparkSession.read 
    .option("parserLib", "univocity") 
    .option("multiLine", "true") 
    .csv(file) 

注意,這需要整個文件讀取到單執行,如果你的數據太大,可能無法正常工作。標準文本文件讀取將在執行任何其他解析之前按行分割文件,這將阻止您處理包含換行符的數據記錄,除非您可以使用不同的記錄分隔符。如果不是,您可能需要實現自定義TextInputFormat來處理多行記錄。