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:根据特定列中的唯一值填充其他列的主要内容,如果未能解决你的问题,请参考以下文章

QTableview:根据其他列中的值显示特定列中的数据

如何根据列中的值自动填充谷歌表格中的数据

在 PHP 中,有没有办法循环查询并根据值将其组织到特定列中?

根据列中的日期填充代理 Datekey

根据第一列中的唯一值计算第二列中值的出现次数

Numpy - 如何根据其他列中的二进制值计算列中的值?