2017-06-22 176 views
2

我使用的是火花的工作,使用下面的代碼行從聲明區讀取csv文件數據以及應對這些數據到HDFS:CSV數據導出/複製到HDFS將在怪異格式

val conf = new SparkConf().setAppName("WCRemoteReadHDFSWrite").set("spark.hadoop.validateOutputSpecs", "true"); 

val sc = new SparkContext(conf) 
val rdd = sc.textFile(source) 

rdd.saveAsTextFile(destination) 

CSV文件在下面的格式具有數據:

CTID,C3UID,區域,產品,關鍵字

1,1004634181441040000,東,移動,NA

2,1004634181441040000,西,平板,NA

而當數據進入HDFS不言而喻在以下格式:

CTID,C3UID,區域,產品,關鍵字

1,1.00463 E + 18,東,移動,NA

2,1.00463E + 18,西,平板電腦,NA

我無法找到背後的任何有效理由。 任何形式的幫助,將不勝感激。

問候, 布佩希

回答

3

什麼情況是,因爲你的C3UID是大量的,它就會被解析爲雙然後保存在標準雙人符號。您需要修復架構,並確保您以Long,BigDecimal或String的形式讀取第二列,然後在字符串表示中不會有任何更改。

+0

感謝您的回覆@瑞克莫里茨當你說我應該修復我的模式,這是否意味着我應該使用Spark Dataframe API從共享位置讀取數據並將數據寫入HDFS? –

+0

@ChauhanB:不一定 - 但它可能有幫助。一個好的起點是檢查RDD中的類型 - Double的檢測可能已經發生在sc.textFile中,或者在保存步驟中。如果你真的想複製數據,也可以考慮使用HDFS-API,而不是Spark裏面的/。如果你想在後續處理中重新使用數據,使用Spark是一個更好的選擇 - 對於這種類型的數據,DataFrame API更合適,所以我會推薦。 –

+0

我想去Spark API,因爲我希望在將數據保存到HDFS之前在行數據頂部執行某種數據清理和數據清理。我也探索過其他工具,比如Apache Nifi,但是我想避免爲Apache Nifi增加額外的集羣成本。我想在我的主應用程序在HDFS中加載數據之後運行我的現有spark和HDFS集羣。你認爲這是一個好方法嗎?在將數據保存到HDFS之前,您是否覺得使用Spark進行數據加載是一個好主意[我將在其間進行數據清理]? –

0

有時您的CSV文件也可能是罪魁禍首。不要在Excel中打開CSV文件,因爲Excel可能會將這些大數值轉換爲指數格式,因此一旦使用Spark任務將數據導入hdfs,它將以字符串格式顯示。

因此,在使用spark工具導入到hdfs之前,請確保您的CSV數據不應該在excel中打開。如果你真的想看到你的Excel的內容使用記事本++或任何其他文本編輯器工具