您好,对很长的文字表示歉意,
我们使用配置单元1.2.0并按日期对表进行分区,按客户ID进行存储分区,并按客户ID进行排序。 (我知道,不应该对同一事物进行排序,但是这样做是有道理的。)
测试性能时,我们使用已经存在的表,因此每个分区有128个文件(表有128个存储桶)。性能影响很大。
但是我注意到,在实时环境中,所有插入都会创建额外的128个文件。我期望看到Hive插入到现有文件中。如果我们每小时填充一次表格,那么我们可以期望24 x 128个文件,全部排序。但这实际上不再排序-它是每个文件排序。我敢肯定,它仍然很重要,但是它将对性能造成冲击。表每天有约1亿行。而且由于某些后续/较晚的输入,实际在一个分区中插入的次数可能大于24,可能是30至40。
我们目前正在考虑每周进行一次 compact 工作,但这确实令人沮丧:)。最初,这是一个Spark管道,然后需要从“ Spark暂存表”中插入Hive,因为Spark无法写入该表,现在我们正在考虑进行 compaction 作业的可能性。
有任何评论/建议吗?
谢谢!
答案 0 :(得分:1)
我没有明白您要问的问题。
但是根据您的问题。
众所周知,如果将其插入到还原表中,配置单元将创建 _copy 的新存储分区,它将不会编辑或更新现有存储分区 而是使用新的值创建一个新的存储桶。
如果您正处于应用程序的设计阶段,建议您根据可以作为运行ID的techincal分区再创建1个partition子句。 例如,如果您每小时运行一次进程,则可以根据小时创建新分区,也可以是可以生成的唯一ID
所以您的直接结构将类似于
table_name/<date>/<hour>/bucketes_files
您无法编辑现有存储桶。
其他变通方法是与主表一起创建一个临时表,该表将在1天左右的时间内保存您的数据,并将该表与新数据连接在一起,并插入覆盖主表,这样您的存储桶将容纳所有对customer_id进行了排序,并且在我们将数据覆盖到现有表中的过程中将没有文件的副本