0

我有一個CSV文件,我嘗試使用Spark CSV package加載,並且它沒有正確加載數據,因爲其中的幾個字段中有\n。下面兩行Spark CSV包無法處理字段中的 n

"XYZ", "Test Data", "TestNew\nline", "OtherData" 
"XYZ", "Test Data", "blablablabla 
\nblablablablablalbal", "OtherData" 

我使用下面的代碼在網上讀它解決了多個問題,換行,但它似乎並不爲我的情況是直接的,我使用parserLib作爲univocity

SQLContext sqlContext = new SQLContext(sc); 
    DataFrame df = sqlContext.read() 
     .format("com.databricks.spark.csv") 
     .option("inferSchema", "true") 
     .option("header", "true") 
     .option("parserLib","univocity") 
     .load("data.csv"); 

請指導如何在以引號開頭的字段中替換換行符。有沒有更簡單的方法?

回答

2

根據SPARK-14194(解析爲一個副本)中的字段換行字符,不支持,將來也不會。

我建議通過wholeFile選項解決這個問題,它似乎合併。我正在解決這個問題,就像那個人擁有公關一樣。

然而,這是Spark 2.0,並且您使用spark-csv模塊。

在所涉及的SPARK-19610它是固定與pull request

嗯,我明白這樣做的動機,儘管我與CSV理解通常要麼避免換行的字段或一些實現將需要大約現場報價值換行

換句話說,在Spark 2.x中使用wholeFile選項(如您在CSVDataSource中所見)。

至於火花CSV,this comment可能有一定的幫助(突出礦井):

然而,也有類似的JIRAs抱怨這一點,的相當位原始CSV數據源試圖支持雖然這是錯誤地實施。這至少會嘗試將其與JSON匹配,並且可能會更好地提供處理此類CSV文件的方法。 其實,目前的實施需要引用 :)。 (據說R實際上也支持這種情況)。

在火花CSV的Features你可以找到以下內容:

該軟件包還支持節能簡單(非嵌套)數據幀。當寫文件API接受幾個選項:

  • 報價:默認引號字符是",但可以設置爲任意字符。這是根據quoteMode編寫的。

  • quoteMode:當引用字段(ALL,極小(默認),NON_NUMERIC,NONE),看報價單模式

0

升級到Spark 2.x.換行符實際上是由ascii 13和10表示的CRLF。但反斜槓和'n'是不同的ascii,它們通過編程方式解釋和編寫。 Spark 2.x會正確讀取..我試過了...... .b。
val conf = new SparkConf().setAppName("HelloSpark").setMaster("local[2]") val sc = SparkSession.builder().master("local").getOrCreate() val df = sc.read.csv("src/main/resources/data.csv") df.foreach(row => println(row.mkString(", ")))
如果您不能升級,請使用正則表達式在RDD上清理\ n。這不會刪除行結束,因爲它是$正則表達式。 S·B·

val conf = new SparkConf().setAppName("HelloSpark").setMaster("local") 
    val sc = new SparkContext(conf) 
    val rdd1 = sc.textFile("src/main/resources/data.csv") 
    val rdd2 = rdd1.map(row => row.replace("\\n", "")) 
    val sqlContext = new SQLContext(sc) 

    import sqlContext.implicits._ 
    val df = rdd2.toDF() 
    df.foreach(row => println(row.mkString(", "))) 
+0

嗨Apurva感謝不幸的是我沒有選擇移動到星火2.0 – u449355

+0

哎呦..然後做一個清理\ n使用簡單的rdd.map從RDD使用正則表達式。隨時都會發生。數據中有垃圾,需要清理。這個正則表達式不會觸及CRLF,因爲行結束符是正則表達式中的$。 –

1

有可供星火2.2的用戶帳戶的選項用於CSV文件中的換行符。它最初被稱爲wholeFile,但在發佈之前更名爲multiLine

這裏是一個CSV裝載的與該選項的數據幀的例子:

var webtrends_data = (sparkSession.read 
.option("header", "true") 
.option("inferSchema", "true") 
.option("multiLine", true) 
.option("delimiter", ",") 
.format("csv") 
.load("hdfs://hadoop-master:9000/datasource/myfile.csv"))