我需要将记录流插入到配置单元分区表中。表结构类似于
CREATE TABLE store_transation (
item_name string,
item_count int,
bill_number int,
) PARTITIONED BY (
yyyy_mm_dd string
);
我想了解一下Hive是如何处理内部表中的插入的。
是否将所有记录插入到yyyy_mm_dd=2018_08_31目录中的单个文件中?或者配置单元在一个分区内拆分为多个文件,如果是,什么时候拆?
如果每天有100万条记录,并且查询模式介于日期范围之间,那么下面哪一条性能好?
Insert将在所有情况下执行相同的操作,因为Insert不会查询现有数据(除非使用select from本身进行插入),并且通常每个容器都将创建自己的文件,除非配置了文件合并。
如果按日期对表进行分区,则使用日期范围查询数据会执行得更好。文件太多可能会导致性能下降,因此您可能希望在INSERT期间合并文件。什么是文件太多?比如每天的分区都有几百甚至上千个。每个分区拥有很少的文件不会导致性能问题,您不需要合并它们。
Insert语句将在分区目录中创建其他文件,通常不会与现有文件合并。将创建多少个文件取决于insert语句和配置设置。
运行+配置设置的最终映射器或还原器的数量将决定输出文件的数量。您可以通过添加“order by”子句来强制它在单个reducer上运行。在这种情况下,每个分区将创建一个额外的文件,但它的工作速度会很慢。也可以使用distribution by partition key
来减少创建的文件数,但这会触发额外的reducer阶段,并且工作速度会比map only任务慢。
您还可以使用以下设置将新文件与现有文件合并:
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或select将同样工作。
如果您已经有了与目标表相同格式的文件,那么最快的方法就是将它们放在分区目录中,而完全不使用DML查询。
对于ORC文件,您可以使用以下命令有效地合并文件:alter TABLE T[PARTITION partition_spec]concatenate;
查询示例: 典型错误消息: 处理语句时出错:失败:执行错误,从org.apache.hadoop.hive.ql.exec.mr.MapredTask返回代码2 问题2:当我运行命令?我是否只运行相同的命令,但使用STRING而不是bigint?**完整错误消息:**
非常感谢任何帮助。
null 但在最后一步(4)中给了我一些错误。我在这里附加了几行错误。请帮忙。 我已经按照下面的链接完成了所有的步骤。在配置单元的外部表中创建分区
当使用外部配置单元表时,是否有一种方法可以删除目录中的数据,但通过查询保留分区。请注意,我不想删除表并重新创建它。我只想清空底层文件夹并重新启动一个进程。我的表很大,按年、月、日期和小时划分分区,手动重新创建分区需要大量时间。 谢谢
如何在压缩表中实现从Oracle到配置单元的Sqoop导入 配置单元:创建外部表xx.tmp_member3(a字符串、kpi_name字符串、b字符串、c字符串),由(YEAR INT,MONTH INT,DAY INT)行格式分隔字段以“”终止,“存储为ORC位置”/ENVIR./2019/4/20190416"TBLPROPERTIES(“ORC.compress”=“bzip2”); 我已