好的,考虑到目标文件的大小、内存使用和执行时间,这是我完善的方法。这些文件还包括快速压缩和字典编码。
我的 HDFS 块大小是 128 兆 (128 * 1024 * 1024):
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
</property>
这是我最终的 parquet 文件,它们都非常接近 hdfs 块的大小。
133916650 2018-07-06 07:05 /year=2018/month=01/HoldingDetail_201801_0001.parquet
133459404 2018-07-06 07:05 /year=2018/month=01/HoldingDetail_201801_0002.parquet
133668445 2018-07-06 07:05 /year=2018/month=01/HoldingDetail_201801_0003.parquet
134004329 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0004.parquet
134015650 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0005.parquet
132053162 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0006.parquet
132917851 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0007.parquet
122594040 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0008.parquet
我就是这样做的..
A.想出一个粗略的行数来生成一堆 10 兆左右的 SMALL parquet 文件。就我而言,我选择了 200,000 条记录。许多较小的 parquet 文件比一个大型 parquet 文件更节省空间,因为如果单个文件中的数据种类更多,字典编码和其他压缩技术就会被放弃。一次写大约 10 兆也可以释放内存。
您的文件将如下所示:
07916650 2018-07-06 07:05 /year=2018/month=01/HoldingDetail_201801_0001.parquet
12259404 2018-07-06 07:05 /year=2018/month=01/HoldingDetail_201801_0002.parquet
11368445 2018-07-06 07:05 /year=2018/month=01/HoldingDetail_201801_0003.parquet
07044329 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0004.parquet
13145650 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0005.parquet
08534162 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0006.parquet
12178451 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0007.parquet
11940440 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0008.parquet
09166540 2018-07-06 07:05 /year=2018/month=01/HoldingDetail_201801_0009.parquet
12594044 2018-07-06 07:05 /year=2018/month=01/HoldingDetail_201801_0010.parquet
11684245 2018-07-06 07:05 /year=2018/month=01/HoldingDetail_201801_0011.parquet
07043129 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0012.parquet
13153650 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0013.parquet
08533162 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0014.parquet
12137851 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0015.parquet
11943040 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0016.parquet
B.创建所有较小 parquet 文件的列表,文件大小加在一起时不超过 HDFS 块大小。在上面的例子中:
/year=2018/month=01/HoldingDetail_201801_0001.parquet
to
/year=2018/month=01/HoldingDetail_201801_0012.parquet
plus
/year=2018/month=01/HoldingDetail_201801_0014.parquet
占用 133,408,651 字节。
C.打开一个名为 HoldingDetail_201801_temp.parquet 的新文件
一次读取一个列表中的所有较小文件,并将它们作为 parquet ROW GROUP 写入临时文件。将每个文件作为一个行组写入非常重要,这样可以保留压缩编码并保证写入的字节数(减去架构元数据)与原始文件大小相同。
删除列表中所有较小的文件。
将临时文件重命名为 HoldingDetail_201801_0001.parquet。
对剩余的较小文件重复步骤 B 和 C,以创建 *_0002.parquet、*_0003.parquet、*_0004.parquet 等,这些文件将是大小略低于 hdfs 块大小的目标文件。
(我还添加了一个检查,如果文件大小的总和 > 0.95 * dfs.blocksize 然后继续合并找到的文件)