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

Posted

技术标签:

【中文标题】如何在 HIVE 中合并具有不同模式的表?【英文标题】:How to union tables with different schema in HIVE? 【发布时间】:2016-04-20 16:03:45 【问题描述】:

我在 HIVE 中有两个表:

表 A,其中包含列“N”,其类型为数组 表 B,其中“N”列未出现

表 A 和 B 都包含“C”列。

我想这样联合他们:

select g.* from 

(select N, C from A
union all
select null as N, C from B
) g;

但这会在 HIVE 中引发错误:

FAILED:...Schema of both sides of union should match: Column N is of type array<string> on first table and type void on second table.

所以,我尝试转换数据类型:

select g.* from 

(select N, C from A
union all
select cast(null as array) as N, C from B
) g;

"cannot recognize input near 'array' ')' 'as' in primitive type specification. 失败

我该如何解决这个问题?谢谢

【问题讨论】:

【参考方案1】:

嗯。可能有一种更简单的方法,但我不确定如何在 Hive 中表达 NULL 数组常量。您可以为此使用 SQL:

select g.*
from (select N, C from A
      union all
      select A.N, C
      from B join
           A 
           on 1 = 0
     ) g;

换句话说,我可能不知道如何表达我脑海中的常数。但是,我可以安排从A 获取它——通过未能匹配到一行。

【讨论】:

会因为join而变慢吗? @Candic3 。 . .老实说,我不知道。其他数据库在连接方面会非常聪明,但 Hive 可能不会。您可以随时执行(select A.* from A limit 1) 之类的操作——这应该非常快。

以上是关于如何在 HIVE 中合并具有不同模式的表?的主要内容,如果未能解决你的问题,请参考以下文章

如何合并具有不同列号的两个表,同时删除具有大量列的表的重复项

如何使用 django 在 mysql 中的两个不同模式中使用两个具有相同名称的表

如何在 SSIS 中使用不同的键合并/联合表?

HIVE JOIN 两个具有不同行数的表给出错误的列值

合并具有不同列数的表

Hive - 如何通过列A和B以及不同的列C组合组