2017-10-19 180 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的记录/观察数据量很低。您可能会对每组记录执行一些通用分析,并按事件名称/编号进行分组 - 在执行分组操作时,它将对同一个节点名称/编号对应的所有数据进行混洗并放置。 –

相关问题