Hive View 查询性能:具有不同模式的联合表

Posted

技术标签:

【中文标题】Hive View 查询性能:具有不同模式的联合表【英文标题】:Hive View Query Performance: Union tables with different schemas 【发布时间】:2018-11-20 02:22:23 【问题描述】:

我有一个场景,我有两个 Hive 表,第二个基本上是第一个的进化模式(在这个例子中它有 1 个列)。

Table_A

business_date String
Name String
Age Number
 partitioned by business_date

Table_B 
business_date String
Name String
Age Number
Address String
 partitioned by business_date

为了从架构更改中混淆下游用户,我正在使用以下语法创建一个 Hive 视图:

Create VIEW customer_info AS 
select * from Table_B 
UNION 
select business_date, name, age, null as address from Table_A

我知道上面返回了所有数据,但是从性能的角度来看,如果对具有有效 business_date 值的视图运行查询,是否会考虑分区键?还是在使用视图时我会失去这个好处?

编辑:我应该提到 business_date 实际上是所有分区中的唯一值。这意味着,Table_A 中提供的数据不应在 Table_B 中提供。将 Table_A 视为数据的“旧版本”。 鉴于此,如果目标是从最终消费者那里抽象出架构更改,这是提供数据的最佳方法吗?

编辑#2:由于大量其他问题,无法将此数据存储在一个表中。

【问题讨论】:

【参考方案1】:

您没有在查询中使用任何分区谓词,这就是它不会进行分区修剪的原因。使用explain 命令检查这一点,它将显示应用的分区谓词。分区修剪应该适用于视图。

UNIONUNION ALL+DISTINCT 相同。 如果适用,请改用UNION ALL,它的性能会更好。

另一方面,按独特的方式进行分区将创建单行分区,这可能会杀死您的配置单元元存储。希望你的意思是别的意思

business_date 实际上是跨所有分区的唯一值

在这种情况下去掉分区,性能会明显更好。

【讨论】:

UNION ALL 更有意义,完全忘记了,谢谢!。就分区谓词而言,考虑到两个表都按 business_date 分区,有没有办法将其应用于此特定场景并且该值在两个表中都是唯一的。 @NicolasCage 如果您不按 business_date 进行过滤,则在这种情况下分区将无济于事。尝试增加并行度以获得更好的性能:***.com/a/48487306/2700344

以上是关于Hive View 查询性能:具有不同模式的联合表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 HIVE 中合并具有不同模式的表?

使用多个联合优化查询性能

与查询相比的视图性能(使用联合语句)

hive UNION和子查询

联合所有在 SQL Server 中的视图性能问题

具有复杂查询匹配模式的 MySQL 与 PostgreSQL 性能