2017-10-19 143 views
2

情況如何? 我有一萬個CSV文件(每個250kb - 270kb),我想用Spark(Pyspark精確地)處理。每個CSV文件都代表一個特定事件的過程數據。你可以說一個CSV文件代表一個對象。由於我想將數據存儲在HDFS上,所以我必須找到連接數據的方式(因爲在HDFS上存儲大量微小數據效率不高)。如何在Hadoop HDFS上存儲數千個CSV文件

一個CSV文件的片段(簡化)。

Time  Module v1 v2  v3  v4 v5 v6  v7  v8 
00:00:00 Start 0 26,2 26,0 0 0 25,899 25,7 0 
00:00:06 2: M1 0 26,1 26,2 0 0 25,8 25,899 0 
00:01:06 2: M1 0 26,6 26,6 0 0 26,8 26,799 0 
00:02:05 2: M1 0 27,1 27,0 0 0 27,7 27,7 0 
00:03:06 2: M1 0 27,3 27,5 0 0 28,1 28,1 0 

完整的數據有45-50列,約1000行。

到目前爲止我的想法。 我想將每個CSV到一個JSON對象,然後串聯的JSON對象所看到如下

{ 
"Event": "MLV14092", 
"Values": [ 
    { 
    "Time": "00:00:00", 
    "Module": "Start", 
    "v1": "33.299" 
    ... 
    }, 
    { 
    "Time": "00:00:06", 
    "Module": "2: M1", 
    "v1": "33.4" 
    ... 
    } 
] 
} 

問題。這是一種有效的方法嗎?我對Hadoop環境相對比較陌生,並且已經使用JSON文件完成了一些教程。但是在那些教程中,我總是能夠將一個JSON對象存儲在一行中,因此我不必擔心HDFS會將文件分割成多少行。有一個JSON對象非常「大」,它不適合一條線。 有沒有更好的方法可以繼續?

回答

1

一般來說,你不想在HDFS中存儲很多小文件 - 小的存檔文件<〜64-128MB大小。根據你的描述,它也看起來像「事件」名稱/ ID將是非常重要的,但它不是現有CSV文件(即它在文件名中,但不在文件中)的一部分。

考慮到文件的大小和數量仍然是沒有那麼大,你有沒有考慮寫一個小shell或Python腳本執行以下操作:

  • 從每個CSV
  • 前置刪除頁眉/列追加到包含「事件」名稱/ ID
  • 將結果存儲在一個新的文件

你會將該腳本應用到每個每個文件每個CSV,這將使你在轉換後的輸出文件。 (您的腳本也可以批量處理整個文件集或文件子集)

然後,您可以連接轉換後的輸出文件並將連接的文件存儲在HDFS中。連接的文件將是節省空間的,線分隔的,並且非常適合使用諸如PySpark/Spark和Hive等工具進行探索和分析。

在另一個註釋中,對於此類分析,存在比CSV更優化的文件格式,但考慮在此初始步驟集之後探索列式文件格式主題。對於Spark,您可能希望稍後查看以Parquet格式存儲此數據,以及以ORC格式存儲Hive。您可以使用相同的工具將數據轉換爲這些格式。

+0

感謝您的回答!由於數據將被拆分並分佈在節點上,因此我沒有考慮將csv作爲選項,因此節點A可能具有部分事件A,而節點B具有事件A的其餘部分。但實際上不是問題,我會盡力實現你的想法。 – Rob

+0

有關在節點之間分割的特定事件的數據:通常對於您所描述的情況,這不會是一個問題;每個Event name/id的記錄/觀察數據量很低。您可能會對每組記錄執行一些通用分析,並按事件名稱/編號進行分組 - 在執行分組操作時,它將對同一個節點名稱/編號對應的所有數據進行混洗並放置。 –

相關問題