【问题标题】:Populate the columns of a Hive SQL query with results of another query使用另一个查询的结果填充 Hive SQL 查询的列
【发布时间】:2020-01-29 20:38:38
【问题描述】:

Apache Hive(版本 1.2.1000.2.6.5.0-292)

我有一个表 A,它有很多列。我正在尝试仅从 A 中选择我需要的列,以及我希望在键值对表 B 中存在的列。(下面的示例)。我可以查询 B 以获取我需要的列,但我正在努力将此 sql 查询的输出作为 A 中使用的查询的列。有没有办法在一个 sql 查询中做到这一点?我可以编写一个 python 程序来创建 SQL,但为了方便最终用户,我宁愿只在一个查询中使用它。

表的 DDL

create table A (
a1 string,
a2 string,
a3 string,
b1 string,
b2 string,
b3 string,
)

create table B (
key string,
value string,
)

表 B(键值表)中的数据。需要注意的是,value 列中的数据不能通过key 列中的对应值来推断。为了简单起见,我将它们写成a1,a2

key,value
a,a1
a,a2
a,a3
b,b1
b,b2
b,b3

查询以获取正确的列 = select value from B where key='a'

当您将此查询的结果与表 A 查询合并时,您应该得到此 sql 语句

select a1,a2,a3 from A

如您所见,我们正在尝试导出表 A 中使用的列

我的第一次尝试没有成功:

select 
(select value from B where key='a')
from A

这样做的正确方法是什么?

提前致谢!

【问题讨论】:

  • 你能展示一些示例输入和预期输出吗?
  • 您需要使用某个键进行 JOIN。如果要添加列并从其他数据集中填充它们。应该连接两个数据集。

标签: hadoop hive hiveql


【解决方案1】:

您可以尝试生成查询并写入文件。完成后,您可以使用 source 命令调用现有的 hive hql:

以下是您的示例查询示例:

创建表和虚拟数据:

CREATE EXTERNAL TABLE IF NOT EXISTS a_table(
a1 string,
a2 string,
a3 string,
b1 string,
b2 string,
b3 string)
LOCATION '/user/xyz/a_table';

insert into table a_table
 VALUES ('a11', 'a12', 'a13','b11','b12','b13'), ('a21', 'a22', 'a23','b21','b22','b23');


CREATE EXTERNAL TABLE IF NOT EXISTS b_table (
key string,
value string
)
LOCATION '/user/xyz/b_table';

insert into table b_table
 VALUES ('a', 'a1'), ('a','a2'),('a','a3'), ('b', 'b1'), ('b','b2'),('b','b3');

验证数据到表中:

select * from a_table;
OK
a11     a12     a13     b11     b12     b13
a21     a22     a23     b21     b22     b23
Time taken: 0.124 seconds, Fetched: 2 row(s)


select * from b_table;
OK
a       a1
a       a2
a       a3
b       b1
b       b2
b       b3
Time taken: 0.15 seconds, Fetched: 6 row(s)

这是hive hql 部分,用于根据给定键生成语句,然后使用source 运行查询:

insert overwrite local directory '/home/xyz/temp_hql/out'
select concat_ws(" ", "select",concat_ws("," , collect_list(value)), "from a_table") 
from b_table where key = 'a';

source /home/xyz/temp_hql/out/000000_0;
OK
a11     a12     a13
a21     a22     a23

insert overwrite local directory '/home/xyz/temp_hql/out' 
select concat_ws(" ", "select",concat_ws("," , collect_list(value)), "from a_table") 
from b_table where key = 'b';

source /home/xyz/temp_hql/out/000000_0;
OK
b11     b12     b13
b21     b22     b23

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    相关资源
    最近更新 更多