hive:如何使用hiveql执行select查询以输出唯一的主键?

mec1mxoz  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(651)

我有下面的模式数据集,我想把它转换成一个可以导出到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 适用于所有列的组合。我只想对 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等之间没有算术关系,因此任何求平均或求和的技巧都是不可行的。
有什么办法吗?

9bfwbjaz

9bfwbjaz1#

,,我只想对调用id应用distinct操作“
但是Hive怎么知道要消除哪一行呢?
在不知道您拥有的stat字段的数据量/大小的情况下,可以执行以下查询:

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;
y53ybaqx

y53ybaqx2#

一个快速的想法,不是最好的,但会做的工作-
配置单元>创建表temp1(a int,b string);
配置单元>插入覆盖表temp1
从intable group by call|id中选择call|id,max(concat(stat1,“|”,stat2,“|”,stat3));
配置单元>插入覆盖表
从temp1中选择a、split(b,“|”)[0]、split(b,“|”)[1]、split(b,“|”)[2];

相关问题