【问题标题】:Hive View Query Performance: Union tables with different schemasHive View 查询性能:具有不同模式的联合表
【发布时间】: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:由于大量其他问题,无法将此数据存储在一个表中。

【问题讨论】:

    标签: hadoop hive hiveql hive-query


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • UNION ALL 更有意义,完全忘记了,谢谢!。就分区谓词而言,考虑到两个表都按 business_date 分区,有没有办法将其应用于此特定场景并且该值在两个表中都是唯一的。
    • @NicolasCage 如果您不按 business_date 进行过滤,则在这种情况下分区将无济于事。尝试增加并行度以获得更好的性能:stackoverflow.com/a/48487306/2700344
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多