HIVE QL 杂记
最近要处理用户访问日志,需要从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 杂记相关推荐
- 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错误 起因 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 启动hiveserver2时报错Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
启动hiveserver2时报错: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metada ...
- 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 ...
最新文章
- FPGA之道(3)数字系统之间的接口电平标准
- 以杨辉三角形的三种实现体会python的编程特性
- 一个项目从开工到交付使用需要经历的过程
- python计算方位角_实例讲解:用python 计算方位角(根据两点的坐标计算)记得收藏哦...
- 轻量化CNN网络MobileNet系列详解
- 织梦task_do.php,织梦20160906更新后栏目空白问题
- 【opencv学习】【Canny边缘检测】
- 吴裕雄--天生自然 PHP开发学习:MySQL 插入数据
- android手机用户收入,苹果与安卓用户特征对比 iPhone用户高收入占多
- Windows环境下用nmake编译libevent
- 【操作篇】Excel中如何快速插入空白行,小白技巧
- unity urp 实现车漆效果
- 3月股权激励团队管理内容回顾
- 计算机毕设项目:毕业论文管理系统(二)
- SAP-MM知识精解-常见报表汇总(01)
- 浅析大规模多语种通用神经机器翻译方法
- Integer Intervals
- 【年终策划】逆袭:盘点2012互联网
- 评价体系的构建之指标筛选
- pyspark- ml-features