最近要处理用户访问日志,需要从HIVE中取数据,写了一些HIVE QL,有一点小感想,记录在此。

1. 临时表

在HIVE中进行多表连接时,可以给一些临时表命名,这样有助于理清查询语句之间的逻辑,格式为:

#将从table表中取出的a,b列组成的临时表命名为t
(SELECT a,b FROM table) t

在一些情况下,必须采用命名临时表的方法,比如我们在处理日志时,可能希望从日志的某个字段中抽取出某些有用的信息X,然后对X进行分组(GROUP BY X)。假设希望从URL中抽取出用户的ID,采用以下正则表达式regexp_extract(url,'uid=([0-9]+)',1),我们可能会写成以下形式:

#错误的HIVE QL,会报编译错误:找不到X列
SELECT regexp_extract(url,'uid=([0-9]?)',1) X FROM logs GROUP BY X

这个时候HIVE会报语法错误,找不到X列。这种情况下,我们只能先抽取信息,将抽取出的信息组成的临时表进行命名,然后对这个表进行分组:

#首先将抽取信息组成的临时表命名为L,然后对临时表进行分组
SELECT L.X FROM(SELECT regexp_extract(url,'uid=([0-9]?)',1) FROM logs) L GROUP BY L.X

2. 快速查询

存储在HIVE中的表都是非常非常巨大的,所以加快查询速度非常重要。这方面的技巧非常多,在此只记录一下自己的一些经验。

(1). 如果希望随机取出table表中的N条记录看一下,可以使用以下语句,很多情况下根本不会执行MAP/REDUCE语句,可能是直接从表元数据中取数据。

#快速从table表中取随机N条数据,可能不会触发M/R
SELECT * FROM table LIMIT N

(2). 如果在创建表的时候根据某个列Y进行了分区(PARTITION),则在执行SELECT操作的时候,在WHERE子句中加入Y="xxx"可以显著地减少查询语句的执行时间。每个分区实际上是在HDFS当中表文件夹下面的一个子文件夹,在WHERE子句中使用分区列可以显著地减少搜索空间。详细信息见[2]。

(3). 在执行多表连接时,尽量把小表放在左侧,一来左侧的表会被放入内存,这样将小表放在前面可以有效的防止内存泄露,而来首先连接小表会使得生成的临时表较小,有助于整个查询计划的加速,这点和SQL是一样的。

3. 改写exist in

HIVE QL不支持exist in,但是我们可以用其他语句进行改写:

#带exist in的SQL语句
SELECT t1.X FROM t1 WHERE t1.X EXIST IN (SELECT t2.X FROM t2)
#改写后的HIVE QL语句
SELECT t1.X FROM t1 LEFT JOIN t2 ON t1.X=t2.X WHERE t1.x!=NULL

参考文献:

[1]. 写好HIVE程序的五个提示

[2]. Hive Tips

[3]. HIVE0.5 中Partition简述

转载于:https://www.cnblogs.com/kemaswill/archive/2013/01/08/2850410.html

HIVE QL 杂记相关推荐

  1. hive遇到FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask错误...

    hive遇到FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask错误 起因 ...

  2. hive.ql.exec.DDLTask. MetaException(message:java.io.IOException: Attempt to start meta tracker faile

    Hive 0.13和HBase 0.98.6.1整合出现错误记录下 hive> CREATE TABLE hbase_table_1(key int, value string) > ST ...

  3. hive中删除表的错误Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException

    1:请看操作 [jifeng@jifeng02 hive-0.12.0-bin]$ hiveLogging initialized using configuration in jar:file:/h ...

  4. Hive创表异常,FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask.

    FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Me taException(m ...

  5. hive 运行命令后FAILED: Execution Error, return code 137 from org.apache.hadoop.hive.ql.ex ec.mr.MapredLoc

    FAILED: Execution Error, return code 137 from org.apache.hadoop.hive.ql.ex ec.mr.MapredLocalTask vi ...

  6. Hive更改表名FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Una ble

    FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Una ble to alter ...

  7. hive insert报错return code 1 from org.apache.hadoop.hive.ql.exec.StatsTask (state=08S01,code=1)

    0: jdbc:hive2://Desktop:10000> insert into mytable values('yuchi',16556); Error: Error while proc ...

  8. 启动hiveserver2时报错Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

    启动hiveserver2时报错: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metada ...

  9. Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

    pyspark --master yarn执行代码的时候报错: 020-05-03 10:18:11 WARN Hive:168 - Failed to access metastore. This ...

最新文章

  1. FPGA之道(3)数字系统之间的接口电平标准
  2. 以杨辉三角形的三种实现体会python的编程特性
  3. 一个项目从开工到交付使用需要经历的过程
  4. python计算方位角_实例讲解:用python 计算方位角(根据两点的坐标计算)记得收藏哦...
  5. 轻量化CNN网络MobileNet系列详解
  6. 织梦task_do.php,织梦20160906更新后栏目空白问题
  7. 【opencv学习】【Canny边缘检测】
  8. 吴裕雄--天生自然 PHP开发学习:MySQL 插入数据
  9. android手机用户收入,苹果与安卓用户特征对比 iPhone用户高收入占多
  10. Windows环境下用nmake编译libevent
  11. 【操作篇】Excel中如何快速插入空白行,小白技巧
  12. unity urp 实现车漆效果
  13. 3月股权激励团队管理内容回顾
  14. 计算机毕设项目:毕业论文管理系统(二)
  15. SAP-MM知识精解-常见报表汇总(01)
  16. 浅析大规模多语种通用神经机器翻译方法
  17. Integer Intervals
  18. 【年终策划】逆袭:盘点2012互联网
  19. 评价体系的构建之指标筛选
  20. pyspark- ml-features

热门文章

  1. 大量数据转移_大量数据
  2. java怎么返回xml_java – 如何从Web服务返回XML
  3. mysql获取删除的条数_如何从mysql表中删除数百万条记录而不会减速
  4. 《大数据、小数据、无数据:网络世界的数据学术》一 导读
  5. 读Zepto源码之操作DOM
  6. HBase scan setBatch和setCaching的区别
  7. [20160608]自治事务引起死锁.txt
  8. C# 实现HTML转换成图片的方法
  9. java继承中的一些该注意的问题
  10. SpringBoot使用JSP作为模板