如何在Hadoop HDFS

时间:2017-10-19 08:15:58

标签: json csv hadoop pyspark hdfs

情况如何? 我有几万个CSV文件(每个250kb - 270kb)我想用Spark处理(准确地说是Pyspark)。每个CSV文件代表一个特定事件的过程数据。您可以说一个CSV文件代表一个对象。由于我想将数据存储在HDFS上,我必须找到一种连接数据的方法(因为在HDFS上存储大量微小数据效率很低)。

一个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 个答案:

答案 0 :(得分:1)

通常,您不希望在HDFS中存储许多小文件 - 小文件< ~64-128MB大小。

从您的描述中,它看起来也像“事件”名称/ ID非常重要,但它不是现有csv文件的一部分(即它在文件名中,但不在文件中)。

鉴于文件的大小和数量仍然不是很大,您是否考虑过编写一个小shell或Python脚本来执行以下操作:

  • 从每个csv
  • 中删除标题
  • 在每个包含“事件”名称/ ID
  • 的csv中添加/附加一列
  • 将结果存储在新文件中

您可以将脚本应用于每个文件,这将为您提供转换后的输出文件。 (您的脚本也可以批量处理整个文件集或子集)

然后,您可以连接已转换的输出文件,并将连接的文件存储在HDFS中。连接文件节省空间,以行分隔,非常适合使用PySpark / Spark和Hive等工具进行探索和分析。

另外,对于此类分析,存在比CSV更优化的文件格式,但请考虑在此初始步骤集之后探索列式文件格式主题。对于Spark,您可能希望稍后以Parquet格式存储此数据,并以ORC格式存储Hive。您可以使用相同的工具将数据转换为这些格式。