zoukankan      html  css  js  c++  java
  • 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,这样就可以解决此问题。

      

  • 相关阅读:
    java操作生成jar包 和写入jar包
    jboss配置jndi连接池
    windows 域的LDAP查询相关举例
    LDAP error Code 及解决方法
    HDU 6417
    CF1299D Around the World
    codechef Chef and The Colored Grid
    Educational Codeforces Round 82 (Rated for Div. 2)
    CF1237F Balanced Domino Placements
    CF1254E Send Tree to Charlie
  • 原文地址:https://www.cnblogs.com/ggjucheng/p/2850797.html
Copyright © 2011-2022 走看看