【问题标题】:Hive: How to do a SELECT query to output a unique primary key using HiveQL?Hive:如何使用 HiveQL 执行 SELECT 查询以输出唯一主键?
【发布时间】:2013-02-22 11:55:21
【问题描述】:

我有以下架构数据集,我想将其转换为可以导出到 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,

问题是当我在HIVE 查询中使用关键字DISTINCT 时,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 等之间没有算术关系。因此任何求平均或求和的技巧都是不可行的。

有什么想法可以做到这一点吗?

【问题讨论】:

    标签: select hadoop distinct hive


    【解决方案1】:

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

    hive>创建表 temp1(a int,b string);

    hive>插入覆盖表 temp1

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

    hive>插入覆盖表intable

    select a,split(b,'|')[0],split(b,'|')[1],split(b,'|')[2] from temp1;

    【讨论】:

      【解决方案2】:

      ,,我只想对 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;
      

      【讨论】:

        猜你喜欢
        • 2014-10-17
        • 2015-06-15
        • 2020-07-09
        • 1970-01-01
        • 2013-08-10
        • 2014-06-22
        • 2014-05-12
        • 2016-01-03
        • 2018-08-15
        相关资源
        最近更新 更多