Hive分区,存储桶和排序表-多次插入

时间:2019-11-13 09:50:46

标签: apache-spark hive query-optimization

您好,对很长的文字表示歉意,

我们使用配置单元1.2.0并按日期对表进行分区,按客户ID进行存储分区,并按客户ID进行排序。 (我知道,不应该对同一事物进行排序,但是这样做是有道理的。)

测试性能时,我们使用已经存在的表,因此每个分区有128个文件(表有128个存储桶)。性能影响很大。

但是我注意到,在实时环境中,所有插入都会创建额外的128个文件。我期望看到Hive插入到现有文件中。如果我们每小时填充一次表格,那么我们可以期望24 x 128个文件,全部排序。但这实际上不再排序-它是每个文件排序。我敢肯定,它仍然很重要,但是它将对性能造成冲击。表每天有约1亿行。而且由于某些后续/较晚的输入,实际在一个分区中插入的次数可能大于24,可能是30至40。

我们目前正在考虑每周进行一次 compact 工作,但这确实令人沮丧:)。最初,这是一个Spark管道,然后需要从“ Spark暂存表”中插入Hive,因为Spark无法写入该表,现在我们正在考虑进行 compaction 作业的可能性。

有任何评论/建议吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

我没有明白您要问的问题。

但是根据您的问题。

  • 您最好在客户ID上创建已排序的存储桶 一定会提供性能优化,并且主要是在SMB等联接中 和桶式联接,您将看到很大的进步。
  • 众所周知,如果将其插入到还原表中,配置单元将创建 _copy 的新存储分区,它将不会编辑或更新现有存储分区 而是使用新的值创建一个新的存储桶。

    如果您正处于应用程序的设计阶段,建议您根据可以作为运行ID的techincal分区再创建1个partition子句。 例如,如果您每小时运行一次进程,则可以根据小时创建新分区,也可以是可以生成的唯一ID

所以您的直接结构将类似于

table_name/<date>/<hour>/bucketes_files

您无法编辑现有存储桶。

其他变通方法是与主表一起创建一个临时表,该表将在1天左右的时间内保存您的数据,并将该表与新数据连接在一起,并插入覆盖主表,这样您的存储桶将容纳所有对customer_id进行了排序,并且在我们将数据覆盖到现有表中的过程中将没有文件的副本