配置单元句柄如何插入到内部分区表中?

cunj1qz1  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(369)

我需要将流式记录插入到配置单元分区表中。表结构类似于

CREATE TABLE store_transation (
     item_name string,
     item_count int,
     bill_number int,
) PARTITIONED BY (
   yyyy_mm_dd string
);

我想了解配置单元如何处理内部表中的插入。
所有记录是否插入yyyy\u mm\u dd=2018\u 08\u 31目录中的单个文件?或者配置单元在一个分区内拆分为多个文件,如果是,什么时候?
如果每天有100万条记录,并且查询模式是介于日期范围之间的,那么下面哪一个执行得很好?
内部表中没有分区
按日期分区,每个日期只有一个文件
按日期分区,每个日期有多个文件

tjvv9vkg

tjvv9vkg1#

insert将在所有情况下执行相同的操作,因为insert不查询现有数据(除非您使用select from本身进行插入),并且通常每个容器都将创建自己的文件,除非配置了文件合并。
如果按日期对表进行分区,则使用日期范围查询数据的性能会更好。文件太多可能会导致性能下降,因此您可能希望在插入过程中合并文件。什么是文件太多?就像每天有成百上千的分区。每个分区只有很少的文件不会导致性能问题,您不需要合并它们。
insert语句将在分区目录中创建其他文件,通常不会与现有文件合并。将创建多少文件取决于insert语句和配置设置。
运行+配置设置的最终Map器或还原器的数量将决定输出文件的数量。例如,您可以通过添加'orderby'子句来强制它在单个reducer上运行。在这种情况下,每个分区将创建一个额外的文件,但它的工作速度很慢。也 distribute by partition key 可用于减少创建的文件数,但这将触发额外的reducer阶段,并且比仅Map任务的速度慢。
还可以使用以下设置将新文件与现有文件合并:

SET hive.merge.mapfiles=true;
SET hive.merge.mapredfiles=true;
SET hive.merge.size.per.task=128000000; -- (128MB)
SET hive.merge.smallfiles.avgsize=128000000; -- (128MB)

这些配置设置可能会在结束时触发合并任务(取决于在上述设置中配置的大小),它将合并现有文件以及由insert添加的新文件。
有关合并的更多详细信息,请参见此答案:https://stackoverflow.com/a/45266244/2700344
实际上,表的类型(托管的或外部的)在此上下文中并不重要。“插入”或“选择”的工作原理相同。
如果已经有与目标表格式相同的文件,那么最快的方法是将它们放在分区目录中,而根本不使用dml查询。
对于orc文件,可以使用以下命令高效地合并文件: ALTER TABLE T [PARTITION partition_spec] CONCATENATE;

相关问题