情况如何? 我有几万个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对象如此“大”,它将不适合单行。 还有更好的方法吗?
答案 0 :(得分:1)
通常,您不希望在HDFS中存储许多小文件 - 小文件< ~64-128MB大小。
从您的描述中,它看起来也像“事件”名称/ ID非常重要,但它不是现有csv文件的一部分(即它在文件名中,但不在文件中)。
鉴于文件的大小和数量仍然不是很大,您是否考虑过编写一个小shell或Python脚本来执行以下操作:
您可以将脚本应用于每个文件,这将为您提供转换后的输出文件。 (您的脚本也可以批量处理整个文件集或子集)
然后,您可以连接已转换的输出文件,并将连接的文件存储在HDFS中。连接文件节省空间,以行分隔,非常适合使用PySpark / Spark和Hive等工具进行探索和分析。
另外,对于此类分析,存在比CSV更优化的文件格式,但请考虑在此初始步骤集之后探索列式文件格式主题。对于Spark,您可能希望稍后以Parquet格式存储此数据,并以ORC格式存储Hive。您可以使用相同的工具将数据转换为这些格式。