IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Hive取非Group by字段数据的方法

    Crazyant发表于 2014-07-31 05:12:51
    love 0

    遇到这么一个需求,输入数据为一个ID对应多个name,要求输出数据为ID是唯一的,name随便取一个就可以。

    执行以下hive ql语句:

    SELECT 
      sid,
      class_id 
    FROM
      table2 
    GROUP BY sid ;

    会报错:

    FAILED: Error in semantic analysis: Line 1:18 Expression not in GROUP BY key 'class_id'

    查了一下,HIVE有这么一个函数collect_set,类似于mysql的group_concat函数,把每个分组的其他字段,按照逗号进行拼接,得到一个最终字符串:

    collect_set(col)
    返回类型:array
    解释:返回一个去重后的对象集合

    将上述的QL语句改一下:

    select sid,collect_set(class_id) from table2 group by sid;

    结果是这样的:

    1 [11,12,13]
    2 [11,14]
    3 [12,15]
    4 [12,13]
    5 [16,14]
    7 [13,15]

    这个时候,我们就可以针对第二列做一些计数、求和操作,分别对应到Hive的聚合函数count、sum。

    对应到本文的目的,直接从数组获取第一个元素就达到目的了,这样做:

    select sid,collect_set(class_id)[0] from table2 group by sid;

    结果如下:

    1 11
    2 11
    3 12
    4 12
    5 16
    7 13

    总结:

    1. Hive不允许直接访问非group by字段;
    2. 对于非group by字段,可以用Hive的collect_set函数收集这些字段,返回一个数组;
    3. 使用数字下标,可以直接访问数组中的元素;

    参考文章:http://wangjunle23.blog.163.com/blog/static/117838171201310222309391/

    本文地址:http://www.crazyant.net/1600.html

    您可能也喜欢:

    hive从查询中获取数据插入到表或动态分区

    Hive开发中使用变量的两种方法

    Hive使用TRANSFORM运行Python脚本总结

    HIVE的几个使用技巧

    Firefox数据采集插件大全
    无觅


沪ICP备19023445号-2号
友情链接