如何使用 INSERT-SELECT 查询加载具有复杂数据类型的 Hive 表

Posted

技术标签:

【中文标题】如何使用 INSERT-SELECT 查询加载具有复杂数据类型的 Hive 表【英文标题】:How can I load Hive table with complex data types using INSERT-SELECT query 【发布时间】:2013-11-06 04:34:58 【问题描述】:

我们有一个使用INSERT-SELECT 直接在另一个表上查询将数据加载到表中的查询,如下所示

INSERT OVERWRITE TABLE <table1>
SELECT * FROM <table2> t2
WHERE <some-conditions>;

同样如何加载具有复杂数据类型的表?如何让我的 SELECT 查询中的几个/一些列为复杂的数据类型列做出贡献?我说清楚了吗?

table1 的架构是

TABLE (col1 INT, col2 STRING, col3 ARRAY<STRING>)

注意:可以从文件加载到此类表,但我只是想尝试是否可以使用上述INSERT-SELECT 查询方式加载。感谢您的关注。

【问题讨论】:

数据来自的表的架构是什么?例如t2 在你的例子中?它是否与正在加载的表的架构匹配,可以转换/转换吗? 逐个回答您的问题,上面给出的架构仅适用于 table1。现在我可以将数据作为文本文件加载到 table1 中,这也是非常可能和可行的。 如果我有一个简单的 SELECT 查询或一个 JOIN 查询,它从 table2(或使用 JOIN 的几个表)中获取几列,以便将数据加载到 tabel1,我如何确保提取的数据适合架构? 我清楚了吗?这就是我需要INSERT-SELECT 查询语法的地方。 如何确保提取的数据适合架构? -- 如果您知道目标架构,那么您可以选择要选择的内容并在必要时进行转换新模式——使用 CAST 的 UDF 生成新类型的数据,例如SPLIT 将从字符串创建数组 我有任何使用SPLIT的例子吗? 【参考方案1】:

insert .. select 的 Hive 等效项是以下之一:

1. from (table 2 query)
insert [overwrite] table <table1> [partition clause if partitioned table]

2. create table table1 as select <table2 query>

请注意,#2 (CTAS) 不可靠。将 #1 与显式表创建或类似的东西结合使用会更好:

create table <table1> **like** table2

【讨论】:

以上是关于如何使用 INSERT-SELECT 查询加载具有复杂数据类型的 Hive 表的主要内容,如果未能解决你的问题,请参考以下文章

加载关系时如何指示SQLAlchemy ORM并行执行多个查询?

使用具有中等数据的表提高 SQL Server 查询性能

如何急切加载具有条件和当前用户的关联表?

用大象鸟加载嵌套的json后如何查询它

当 CursorLoader 的构造函数不支持时,如何在 CursorLoader 中使用连接查询

如何在页面加载时处理辅助bean中的GET查询字符串URL参数?