0

我有以下模式数据集,我想将其转换为可以导出到 SQL 的表。我正在使用HIVE. 输入如下

call_id,stat1,stat2,stat3
1,a,b,c,
2,x,y,z,
3,d,e,f,
1,j,k,l,

输出表需要call_id作为其主键,因此它必须是唯一的。输出模式应该是

call_id,stat2,stat3,
1,b,c, or (1,k,l)
2,y,z,
3,e,f,

问题是当我DISTINCTHIVE查询中使用关键字时,它DISTINCT适用于所有组合的列。我只想将 DISTINCT 操作应用于call_id. 有点意思

SELECT DISTINCT(call_id), stat2,stat3 from intable;

但是,这在HIVE(我也不精通 SQL)中无效。

唯一的合法查询似乎是

SELECT DISTINCT call_id, stat2,stat3 from intable; 

但这会返回多行,call_id因为其他列不同,并且整个行是不同的。

注意:a、b、c、x、y、z 等之间没有算术关系。因此,任何求平均或求和的技巧都是不可行的。

有什么想法我该怎么做?

4

2 回答 2

2

一个快速的想法,不是最好的,但会做的工作-

hive>create table temp1(a int,b string);

配置单元>插入覆盖表 temp1

select call_id,max(concat(stat1,'|',stat2,'|',stat3)) from intable group by call_id;

hive>插入覆盖表intable

从 temp1 中选择 a,split(b,'|')[0],split(b,'|')[1],split(b,'|')[2];

于 2013-02-24T08:37:27.113 回答
1

,,我只想对 call_id 应用 DISTINCT 操作”

但是 Hive 将如何知道要消除哪一行?

在不知道您拥有的统计字段的数据量/大小的情况下,以下查询可以完成:

select distinct i1.call_id, i1.stat2, i1.stat3 from (
  select call_id, MIN(concat(stat1, stat2, stat3)) as smin 
  from intable group by call_id
) i2 join intable i1 on i1.call_id = i2.call_id 
  AND concat(i1.stat1, i1.stat2, i1.stat3) = i2.smin;
于 2013-02-22T23:08:45.697 回答