• hive sql遇到的问题


    记录下工作中,使用hive sql遇到的问题,和大家共享。

    某个字段条件过多,查询条件失效

    select * from login where dt='20130101' and (ver !='3.1' or ver !='3.2' or ver != '4.0' or ver != '5.2');

    备注:感谢 杨庆荣的指导,这里笔误,其实修改为如下的sql,功能可以实现,该bug纯属作者的错误:

    select * from login where dt='20130101' and (ver !='3.1' and ver !='3.2' and ver != '4.0' and ver != '5.2');

    这个语句的目的是从一个用户登陆表中,查询20130101当天,版本不是3.1,3.2,4.0,5.2的登陆用户记录。但是,在hive0.90执行,最后返回的是20130101当天全部的登陆用户记录,后面的查询条件看起来是被忽略了。这里看起来同一个字段做这种多个!=或者=的条件查询,过多会失效。

    于是修改了语句,如下:

    select * from login where dt=20130101 and !array_contains(split('3.1,3.2,4.0,5.2',','),ver);

    语句如预期返回查询结果。

    字查询中有多于一个where语句,只有一个where语句能生效

    select url,country,pv,ip from
          (select url,country,count(*) as pv,count(distinct ip) as ip from web_site where dt='20130101'  group by url,country order by url,pv desc) 
          order_area
    where row_number(url) <= 100;

    该语句从一个网站的页面点击明细表web_site,查询20130101当天,每个子域名url下,pv排名前一百的地区。但是第一个where语句where dt='20130101'可以生效,第二个where语句where row_number(url)<=100不能生效。通过explain语句查询该语句的任务计划,确定第二个where语句没有生效执行,最后返回了每个字域名下全部地区的pv。

    该bug在hive 0.81可以出现,不过升级了hive到0.91,问题可以解决。

    hive通过外部表访问hbase的表,使用insert into语句的问题

    hive通过建立外部表可以访问hbase的表,但是从外部表,使用insert into语句,多次插入数据到一个hive内部表,期望数据是追加的,但是数据每次都是被overwrite的。

    INSERT INTO TABLE login_user PARTITION (dt='20130101') select uid FROM pc_login_user_20130101;
    INSERT INTO TABLE login_user PARTITION (dt='20130101') select uid FROM mobile_login_user_20130101;

    pc_login_user_20130101和mobile_login_user_20130101都是hive访问hbase的外部表,代表20130101当天的电脑登陆用户和手机登陆用户,预期是把手机登陆用户的数据追加插入到hive表login_user。但是实际过程中发现insert into每次执行都是overwrite的,所以结果表里只有手机的登陆用户数据。

    该问题在hive0.90+hbase0.941发现。

    hive产生动态分区太多导致的问题

    较多的动态分区会导致job出现以下情况:

    org.apache.hadoop.hive.ql.metadata.HiveException: org.apache.hadoop.ipc.RemoteException: org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException: No lease on /tmp/hive-maintain/hive_2012-11-28_22-39-43_810_1689858262130334284/_task_tmp.-ext-10002/part=33436268/_tmp.000004_0 File does not exist. Holder DFSClient_attempt_201211250925_9859_m_000004_0 does not have any open files.

    解决方案:

    加大动态分区数即可,下面是在当前session下设置。

    SET hive.exec.max.dynamic.partitions=100000;
    SET hive.exec.max.dynamic.partitions.pernode=100000;

    hive删除包含较多分区表有错误

    对包含很多分区的表做删除操作(drop table)时,报了OutOfMemory的异常,在hive中无法删除。

    通过查找资料发现,是个BUG。据说在0.10.0版本进行了修复,详见:https://issues.apache.org/jira/browse/HIVE-2907

    解决方案:通过对此issue的了解,因为hive默认的heap大小为256MB,我将启动RunJar时,heap大小设置为512MB,这样就可以解决此问题。

      

  • 相关阅读:
    怎样在ASP.NET中使用VB.NET上传大文件
    准备开始研读petShop
    Documentum常见问题9—导航树的一些常见设置
    [转]CMMI 入门 基本术语:约束、假设、依赖、风险、承诺
    MyEclipse 8.6反编译插件安装
    Documentum常见问题7—为客户化Type类型Import时添加自定义属性
    【自省篇】程序员的十大技术烦恼
    Documentum常见问题10修改特定Type的显示图标
    打发时间的题目,每天做一点
    Documentum常见问题8—限制导航树上的文件夹个数
  • 原文地址:https://www.cnblogs.com/ggjucheng/p/2850797.html
Copyright © 2020-2023  润新知