Apache spark 配置单元分区、带扣和排序表-多个插入

Apache spark 配置单元分区、带扣和排序表-多个插入,apache-spark,hive,query-optimization,Apache Spark,Hive,Query Optimization,你好,很抱歉发了这么长的短信 我们使用的是Hive1.2.0,表按日期划分,按客户id分类,也按客户id排序。(我知道,它不应该按同样的事情分类,但这样做是有意义的) 当我们测试性能时,我们使用了已经存在的表,所以每个分区有128个文件(表有128个存储桶)。性能影响很大 但我注意到,在实时环境中,所有插入都会创建额外的128个文件。我希望看到配置单元插入到已经存在的文件中。如果我们每小时填写一次表格,那么我们可以得到24 x 128个文件,所有文件都已排序。但这实际上已经不再排序了——它是按文

你好,很抱歉发了这么长的短信

我们使用的是Hive1.2.0,表按日期划分,按客户id分类,也按客户id排序。(我知道,它不应该按同样的事情分类,但这样做是有意义的)

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

但我注意到,在实时环境中,所有插入都会创建额外的128个文件。我希望看到配置单元插入到已经存在的文件中。如果我们每小时填写一次表格,那么我们可以得到24 x 128个文件,所有文件都已排序。但这实际上已经不再排序了——它是按文件排序的。我相信它仍然很重要,但它的性能会受到影响。该表每天有约100米的行数。由于一些后续/延迟的条目,一个分区中的实际插入数量可能会超过24个—可能是30-40个

我们目前正在考虑每周进行压实作业,但这确实令人沮丧:)。最初,这是一个Spark管道,然后需要从“Spark暂存表”插入配置单元,因为Spark无法写入这样的表,现在我们正在考虑是否可以进行压缩作业

有什么意见/建议吗


提前谢谢

我不明白你到底想问什么

但是根据你的问题

  • 最好是在客户id上创建已排序的存储桶 肯定会提供性能优化,主要是在SMB之类的连接中 和扣连接,你会看到很大的改善
  • 众所周知,如果插入到带扣的表中,配置单元将创建 带有的新存储桶\u copy不会编辑或更新现有存储桶 bucket相反,它将创建一个具有新值的新bucket

    如果您正处于应用程序的设计阶段,我建议您在techincal partition的基础上再创建一个partition子句,它可以作为您的运行id。 例如,如果您每小时运行一次进程,那么您可以基于小时创建新分区,也可以是您可以生成的任何唯一id

所以你的结构会是

table_name/<date>/<hour>/bucketes_files
table\u name///bucketes\u文件
您无法编辑现有存储桶


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

谢谢。我担心我会看到这样的事情。就像我在长问题中提到的那样,问题是我们一直在接收特定日期的数据,甚至在接下来的一两天。真是非常不幸的事情。我的想法是继续压缩的想法,然后-我将简单地创建一个周末运行的每周作业,并复制数据,例如,两周前,从原始表中删除所有数据,然后一次性将其写回。谢谢你的回答。我很快就会接受这个答案——只是想继续期待一段时间:)是的,在你的场景中,压缩也是一个好主意。在考虑这一点之前,这只是一个重要的指针。在每天将数据加载到主表的同时,创建另一个表,该表将保存数据一段时间,也可能是15天。以便为压实过程中的最坏情况做好准备。还有一种方法是创建两个表1,它将按原样保存数据(重复的存储桶)并创建另一个具有相同结构的表,每当数据进入表1时,或每天或在您处理某些问题时每周都会从表1插入覆盖。同意-我肯定会在删除之前进行备份。但我仍然发现weir Hive不提供此功能…Hive有其局限性,但编辑现有(存储桶)和搜索、排序并将每个新密钥(客户id)与文件中的数据进行比较并插入现有非常大的文件中的确切位置是多么复杂和耗时,这是有道理的。