Hadoop 配置单元句柄如何插入到内部分区表中?
我需要将流式记录插入到配置单元分区表中。表结构类似于Hadoop 配置单元句柄如何插入到内部分区表中?,hadoop,hive,hdfs,hiveql,hive-partitions,Hadoop,Hive,Hdfs,Hiveql,Hive Partitions,我需要将流式记录插入到配置单元分区表中。表结构类似于 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目录?或者配置单元在一个分区内拆分为多个文
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万条记录,并且查询模式将在日期范围之间,那么下面哪一条表现良好
Insert将在所有情况下执行相同的操作,因为Insert不会查询现有数据(除非您使用select from本身进行插入),并且通常每个容器将创建自己的文件,除非配置了文件合并 如果按日期对表进行分区,则使用日期范围查询数据的性能会更好。文件太多可能会导致性能下降,因此您可能希望在插入过程中合并文件。什么是文件太多?就像每天有数百甚至数千个分区。每个分区只有很少的文件不会导致性能问题,您不需要合并它们 Insert语句将在分区目录中创建其他文件,通常不会与现有文件合并。将创建多少文件取决于insert语句和配置设置 运行+配置设置的最终映射器或还原器的数量将决定输出文件的数量。例如,可以通过添加“order by”子句,强制它在单个减速器上运行。在这种情况下,每个分区将创建一个额外的文件,但它的工作速度会很慢。 另外,
distribution by partition key
可用于减少创建的文件数量,但这将触发额外的reducer阶段,并且比仅映射任务的速度慢
还可以使用以下设置将新文件与现有文件合并:
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新添加的文件
有关合并的更多详细信息,请参阅此答案:
实际上,表的类型(托管的或外部的)在此上下文中并不重要。“插入”或“选择”的工作原理相同
如果已经有与目标表格式相同的文件,那么最快的方法是将它们放在分区目录中,而根本不使用DML查询
对于ORC文件,您可以使用以下命令高效地合并文件:altertable T[PARTITION PARTITION\u spec]CONCATENATE代码>