我有一个按event_date分区的表,由于某种原因,当我将数据插入到外部表中时,有些日期只有一个或两个文件,而有些则超过200个。
在启动Hive查询以插入数据时,我总是使用此代码段,因此我不确定在某些日期(而不是其他日期)何处/如何摆脱错误。我以为'merge.tezfiles'行专门是在插入时处理文件合并的内容。
SET mapred.job.queue.name=my_directory;
use this_directory;
SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;
SET hive.exec.max.dynamic.partitions=2000;
SET hive.exec.max.dynamic.partitions.pernode=2000;
SET hive.merge.tezfiles=true;
我在网上找到的所有内容都提到必须在本地复制文件并再次上传。
有没有一种方法可以以一种简洁的方式合并每个日期分区中的多个文件?
我尝试了以下几个日期,分别具有4个和15个文件。 Hive运行后的输出确认已删除了无关的文件,但是当我回头查看Hadoop时,它的数量与启动时一样多。幸运的是,当我检查数据时,数据仍然准确,因此我不确定首先删除的内容是什么?这根本不是要使用的正确命令吗?
alter table table_being_edited PARTITION(event_dt='2017-01-01') CONCATENATE;
以下是其中一行,它确认已删除了多余的文件:
Moved: 'my_hdfs_filepath/event_dt=2019-10-24/000052_0' to trash at: my_trash_directory/.Trash/Current
好 花费时间:75.321秒
对于具有15个文件的日期,它给了我类似的输出15倍。
我希望将许多文件的日期缩小到一个或两个(如果可能的话),因为我们用完了命名空间。我对这一切都是新手,所以有没有准系统和简单的方法在单个日期分区中合并文件?
答案 0 :(得分:0)
您可以尝试设置以下属性
SET hive.merge.mapfiles=true;
SET hive.merge.mapredfiles=true;
SET hive.merge.smallfiles.avgsize=134217728; ( 128 MB)
您可以参考此link
答案 1 :(得分:0)
通过在我的其他SET配置单元参数之外添加此行,在将零件文件插入到新表中后,我能够将零件文件一致地合并为一个大小为5 GB或更小的文件:
set hive.merge.smallfiles.avgsize=5000000000;
也可以使用getmerge然后将文件放回去,但这需要采取其他步骤在本地拉下文件(根据文件的大小,必须有大量存储空间),这比创建新文件更麻烦表,并使用此附加SET参数插入。
另一个选择是使用
set hive.merge.mapfiles=true;
似乎是创建否的参数。映射器。如果我们的文件数量很少,则必须创建那么多的映射器,而这对于hadoop设计而言并不是最佳选择,因此tez合并选项更合适
答案 2 :(得分:0)
如果HDFS / MapR-FS的块大小为256MB,则最好将smallfiles.avgsize设置为256MB
SET hive.merge.tezfiles=true; --Merge small files at the end of a Tez DAG.
SET hive.merge.mapfiles=true; --Hive will start an additional map-reduce job to merge the output files into bigger files
SET hive.merge.mapredfiles=true; --Hive will start an additional map-reduce job to merge the output files into bigger files
SET hive.merge.orcfile.stripe.level=true; --When hive.merge.mapfiles, hive.merge.mapredfiles or hive.merge.tezfiles is enabled while writing a table with ORC file format, enabling this configuration property will do stripe-level fast merge for small ORC files.
SET hive.merge.size.per.task=256000000; --Size of merged files at the end of the job.
SET hive.merge.smallfiles.avgsize=256000000; --When the average output file size of a job is less than this number, Hive will start an additional map-reduce job to merge the output files into bigger files. This is only done for map-only jobs if hive.merge.mapfiles is true, and for map-reduce jobs if hive.merge.mapredfiles is true.