Hive:根据特定列中的唯一值填充其他列
Posted
技术标签:
【中文标题】Hive:根据特定列中的唯一值填充其他列【英文标题】:Hive: Populate other columns based on unique value in a particular column 【发布时间】:2019-03-14 06:20:28 【问题描述】:我在 Hive 中有两个表,如下所述的 Hive
表 1:
id name value
1 abc stack
3 abc overflow
4 abc foo
6 abc bar
表 2:
id name value
5 xyz overflow
9 xyz ***
3 xyz foo
23 xyz bar
我需要在不考虑 id 和 name 列的情况下计算 value 列。
预期输出是
id name value
1 abc stack
9 xyz ***
我试过这个并在其他数据库中工作,但在 hive 中没有
select id,name,value from
(SELECT id,name,value FROM table1
UNION ALL
SELECT id,name,value FROM table2) t
group by value having count(value) = 1;
Hive 需要如下所述的 group by 子句。
select id,name,value from
(SELECT id,name,value FROM table1
UNION ALL
SELECT id,name,value FROM table2) t
group by id,name,value having count(value) = 1;
并给出输出
id name value
1 abc stack
3 abc overflow
4 abc foo
6 abc bar
5 xyz overflow
9 xyz ***
3 xyz foo
23 xyz bar
我们必须给出我们在 select 子句中使用的 group 中的所有列。但是当我给它考虑所有列时,结果与预期不同。
【问题讨论】:
【参考方案1】:计算解析count(*) over(partition by value)
。
使用您的数据示例进行测试:
with
table1 as (
select stack (4,
1,'abc','stack',
3,'abc','overflow',
4,'abc','foo',
6,'abc','bar'
) as (id, name, value)
),
table2 as (
select stack (4,
5, 'xyz','overflow',
9, 'xyz','***',
3, 'xyz','foo',
23, 'xyz','bar'
) as (id, name, value)
)
select id, name, value
from(
select id, name, value, count(*) over(partition by value) value_cnt
from
(SELECT id,name,value FROM table1
UNION ALL
SELECT id,name,value FROM table2) s
)s where value_cnt=1;
结果:
OK
id name value
1 abc stack
9 xyz ***
Time taken: 55.423 seconds, Fetched: 2 row(s)
【讨论】:
【参考方案2】:你可以试试下面-
seELECT id,name,value FROM table1 a left join table2 b on a.value=b.value
where b.value is null
UNION ALL SELECT
seELECT id,name,value FROM table2 a left join table1 b on a.value=b.value
where b.value is null
【讨论】:
有效,但如果我们动态形成任何列,那么它就会失败。以上是关于Hive:根据特定列中的唯一值填充其他列的主要内容,如果未能解决你的问题,请参考以下文章