如何使用 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并行执行多个查询?