单元单元分区、单元化和排序表-多个插入



你好,很抱歉收到长文本,

我们使用hive 1.2.0,并按日期对表进行分区,按客户id进行分段,还按客户id排序。(我知道,它不应该按相同的东西排序,但这样做是有意义的(。

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

然而,我注意到,在实时环境中,所有插入都会创建额外的128个文件。我希望看到Hive插入到现有的文件中。如果我们每小时填写一次表格,那么我们可以期待24 x 128个文件,全部经过排序。但这并不是真正的排序了——它是每个排序的文件。我相信它仍然很重要,但它的表现会受到打击。该表每天约有1亿行。由于一些后续/延迟的条目,一个分区中插入的实际数量可能大于24,可能为30-40。

我们目前正在考虑每周进行压缩工作,但这真的很令人沮丧:(。最初,这是一个Spark管道,然后需要从"Spark暂存表"插入Hive,因为Spark无法写入这样的表,现在我们正在考虑是否有压缩作业。。。

有什么意见/建议吗?

提前感谢!

我没有明白你到底想问什么。

但根据你的问题。

  • 最好在客户id It上创建已排序的bucket肯定会提供性能优化,主要是在SMB等联接中和桶形连接,你会看到很大的改进
  • 众所周知,如果您插入到buckted表中,则配置单元将创建带有_copy的新bucket将不会编辑或更新现有bucketbucket,它将创建一个具有新值的新bucket。

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

所以你的直接结构会像一样

table_name/<date>/<hour>/bucketes_files

您无法编辑现有存储桶。

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

最新更新