繁体   English   中英

Hive 分区、分桶和排序表 - 多个插入

[英]Hive Partitioned, Bucketed and Sorted table - multiple inserts

您好,很抱歉,很长的文字,

我们使用 hive 1.2.0 并按日期对表进行分区,按客户 ID 分桶并按客户 ID 排序。 (我知道,它不应该按同一件事进行排序,但这样做是有意义的)。

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

然而,我注意到在实时环境中,所有插入都会创建额外的 128 个文件。 我期待看到 Hive 插入到已经存在的文件中。 如果我们每小时填写一次表格,我们可以期待 24 x 128 个文件,所有文件都已排序。 但这不再是真正排序的 - 它是按文件排序的。 我敢肯定它仍然很重要,但它会影响性能。 表每天有约 1 亿行。 并且由于一些后续/延迟条目,一个分区的实际插入数量可能大于 24 - 它可能是 30-40。

我们目前正在考虑每周进行一次压缩工作,但这真的很令人沮丧:)。 最初,这是一个 Spark 管道,然后需要 Hive 从“Spark 暂存表”插入,因为 Spark 无法写入此类表,现在我们正在研究进行压缩作业的可能性......

有什么意见/建议吗?

提前致谢!

我没有得到你到底想问什么。

但根据你的问题。

  • 您在客户 ID 上创建排序桶是个好主意,它肯定会提供性能优化,主要是在 SMB 和桶连接等连接中,您会看到很大的改进。
  • 众所周知,如果您插入分桶表hive将使用 _copy 创建新存储桶,它不会编辑或更新现有存储桶,而是会创建一个具有新值的新存储桶。

    如果您处于应用程序的设计阶段,我建议您根据可以作为您的运行 ID 的技术分区再创建 1 个分区子句。 例如,如果您每小时运行一次进程,那么您可以基于小时创建新分区,或者它可以是您可以生成的任何唯一 ID

所以你的直接结构就像

table_name/<date>/<hour>/bucketes_files

您无法编辑现有存储桶。

其他解决方法是与您的主表一起创建一个临时表,该表将保存您的数据 1 天左右,并使用新数据加入此表并插入覆盖主表,这样您的 bucktes 将保存所有排序的 customer_id,并且会有没有文件副本,因为我们将数据插入到现有表中

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM