hive脚本的执行方式

hive脚本的执行方式大致有三种:

  • hive控制台执行;
  • hive -e "SQL"执行;
  • hive -f SQL文件执行;
    参考hive用法:
  1. usage: hive
  2. -d,--define <key=value> Variable subsitution to apply to hive
  3. commands. e.g. -d A=B or --define A=B
  4. --database <databasename> Specify the database to use
  5. -e <quoted-query-string> SQL from command line
  6. -f <filename> SQL from files
  7. -H,--help Print help information
  8. -h <hostname> connecting to Hive Server on remote host
  9. --hiveconf <property=value> Use value for given property
  10. --hivevar <key=value> Variable subsitution to apply to hive
  11. commands. e.g. --hivevar A=B
  12. -i <filename> Initialization SQL file
  13. -p <port> connecting to Hive Server on port number
  14. -S,--silent Silent mode in interactive shell
  15. -v,--verbose Verbose mode (echo executed SQL to the
  16. console)
1.1. hive控制台执行

顾名思义,是进入hive控制台以后,执行sql脚本,例如:

  1. hive> set mapred.job.queue.name=pms;
  2. hive> select page_name, tpa_name from pms.pms_exps_prepro limit 2;
  3. Total MapReduce jobs = 1
  4. Launching Job 1 out of 1
  5. ...
  6. Job running in-process (local Hadoop)
  7. 2015-10-23 10:06:47,756 null map = 100%, reduce = 0%
  8. 2015-10-23 10:06:48,863 null map = 23%, reduce = 0%
  9. 2015-10-23 10:06:49,946 null map = 38%, reduce = 0%
  10. 2015-10-23 10:06:51,051 null map = 72%, reduce = 0%
  11. 2015-10-23 10:06:52,129 null map = 100%, reduce = 0%
  12. Ended Job = job_local1109193547_0001
  13. Execution completed successfully
  14. Mapred Local Task Succeeded . Convert the Join into MapJoin
  15. OK
  16. APP首页 APP首页_价格比京东低
  17. APP首页 APP首页_价格比京东低
  18. Time taken: 14.279 seconds
  19. hive>
1.2. hive -e "SQL"方式执行

利用hive -e "SQL"的方式进入hive控制台并直接执行sql脚本,例如:

  1. hive -e "
  2. set mapred.job.queue.name=pms;
  3. set mapred.job.name=[HQL]exps_prepro_query;
  4.  
  5. select page_name, tpa_name
  6. from pms.pms_exps_prepro
  7. limit 2;"
1.3. hive -f SQL文件方式执行

执行sql文件中的sql脚本,例如:

pms_exps_prepro.sql文件内容如下:

  1. set mapred.job.queue.name=pms;
  2. set hive.exec.reducers.max=48;
  3. set mapred.reduce.tasks=48;
  4. set mapred.job.name=[HQL]pms_exps_prepro;
  5.  
  6. drop table if exists pms.pms_exps_prepro;
  7. create table pms.pms_exps_prepro as
  8. select
  9. a.provinceid,
  10. a.cityid,
  11. a.ieversion,
  12. a.platform,
  13. '${date}' as ds
  14. from track_exps a;

上述文件中的sql脚本接收一个日期,接收参数写法类似${date},执行时如下执行:

  1. date=2015-10-22
  2. hive -f pms_exps_prepro.sql --hivevar date=$date
  1. date=2015-10-22
  2. hive -f pms_exps_prepro.sql --hivevar date=$date

2. hive转义字符的问题

下面以一个业务场景阐述关于hive转义字符的问题

track_exps记录曝光数据,现在小A希望获取2015-10-20有效的曝光数据
其中有效的曝光记录是指,

  • relatedinfo字段满足数字.数字.数字.数字.数字的格式,
    例如4.4.5.1080100.1

extfield1字段满足request-字符串,section-数字的格式,
例如request-b470805b620900ac492bb892ad7e955e,section-4
对于这个问题,小A写出了如下sql脚本:

  1. select
  2. *
  3. from track_exps
  4. where ds = '2015-10-20'
  5. and relatedinfo rlike '^4.\d+.\d+.\d+.\d+$'
  6. and extfield1 rlike '^request.+section-\d+$';

但是由于正则表达式是被包含在sql里面,所以里面的特殊字符需要转义

2.1. hive -e "SQL"的方式执行

改动如下:

  1. hive -e "
  2. set mapred.job.queue.name=pms;
  3.  
  4. explain select
  5. cityid
  6. from track_exps
  7. where ds = '2015-10-20'
  8. and relatedinfo rlike '\\^4\\.\\\d\\+\\.\\\d\\+\\.\\\d\\+\\.\\\d\\+\\$'
  9. and extfield1 rlike '\\^request\\.\\+section\\-\\\d\\+\\$';"

查看执行计划,可以确定正则表达式解析正确了:

  1. ...
  2. predicate:
  3. expr: ((relatedinfo rlike '^4.\d+.\d+.\d+.\d+$') and (extfield1 rlike '^request.+section-\d+$'))
  4. type: boolean
  5. ...

分析如下:

在hive -e “SQL"的执行方式中,”‘正则表达式’",正则表达式先被一个单引号括起来,再被一个双引号括起来的,所以正则表达式里面,\^的第一个\用来解析第二个\,第二个\才真正起到了转义的作用

2.2. hive -f SQL文件的方式执行

改动如下:

pms_exps_prepro.sql文件内容如下:

  1. select
  2. *
  3. from track_exps
  4. where ds = '2015-10-20'
  5. and relatedinfo rlike '\^4\.\\d\+\.\\d\+\.\\d\+\.\\d\+\$'
  6. and extfield1 rlike '\^request\.\+section\-\\d\+\$';

分析如下:

不同于hive -e "SQL"的执行方式,因为是sql文件,所以正则表达式只被一个单引号括起来而已,一个\就起到了转义的作用了

注意:今天脑子突然糊涂了,对着脚本第一行是 #!/bin/sh 疯狂执行hive -f 结果报错,很愚蠢的问题就是,这样的文件应该是Linux的执行方式 是:sh 文件名  而不是hive -f sql文件

hive的shell用法(脑子糊涂了,对着脚本第一行是 #!/bin/sh 疯狂执行hive -f 结果报错)的更多相关文章

  1. 1.2 位于Shell脚本第一行的#!

    学习<shell脚本学习指南>一书,记录总结,便于自己回忆,希望对你有帮助! 2.4 自给自足的脚本:位于第一行的 #! 1.Shell脚本执行过程 当Shell执行一个程序时,会要求UN ...

  2. shell执行${var:m:n}报错Bad substitution解决办法

    Ubuntu系统下,执行字符串截取脚本时,总是报错:Bad substitution,脚本非常简单如下: #!/bin/sh str1="hello world!" :} 执行后报 ...

  3. shell脚本第一课

    shell脚本的文件名一般是以.sh结尾,也可以以其他格式如.txt,甚至不加后缀. 脚本的第一行的#!/bin/bash表示指定脚本执行时的解析器. #!/bin/bash #文件名:test.sh ...

  4. Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient报错,问题排查

    背景 最近在整合pyspark与hive,新安装spark-2.3.3以客户端的方式访问hive数据,运行方式使用spark on yarn,但是在配置spark读取hive数据的时候,这里直接把hi ...

  5. Linux编程 9 (shell类型,shell父子关系,子shell用法)

    一. shell类型 1.1  交互式 bin/ shell程序 当用户登录到某个虚拟控制台终端或是在GUI中启动终端仿真器时,默认的shell程序就会开始运行.系统启动什么样的shell程序取决于你 ...

  6. Hive学习之路 (十八)Hive的Shell操作

    一.Hive的命令行 1.Hive支持的一些命令 Command Description quit Use quit or exit to leave the interactive shell. s ...

  7. Hive(八)Hive的Shell操作与压缩存储

    一.Hive的命令行 1.Hive支持的一些命令 Command Description quit Use quit or exit to leave the interactive shell. s ...

  8. Hive 基本语法操练(五):Hive 的 JOIN 用法

    Hive 的 JOIN 用法 hive只支持等连接,外连接,左半连接.hive不支持非相等的join条件(通过其他方式实现,如left outer join),因为它很难在map/reduce中实现这 ...

  9. Hive row_number() 等用法

    1.row_number() over()排序功能: (1) row_number() over()分组排序功能: 在使用 row_number() over()函数时候,over()里头的分组以及排 ...

随机推荐

  1. 解决Windows7下virtualbox安装ubuntu出现的0x00000000指令引用0x00000000内存,该内存不能为written问题

    公司电脑只能用Windows7,不能用10,也没WSL用,最近想跑个Linux环境,因为之前装docker toolbox装了virtualbox,没道理再装vmware,遂用vbox开始折腾,没想到 ...

  2. Spring IoC 详解(四)

    Spring IoC 概述 IoC:Inverse of Control(控制反转) 为了更好的理解用可以这样通俗易懂的这样讲:IOC主要是说是new一个类来使用,方式分为:开发这手动创建和Sprin ...

  3. Java的设计模式(4)--抽象工厂模式

    提供一个创建一系列或相互依赖对象的接口,而无须指定他们具体的类.例如某些系统可能需要为用户提供一系列相关对象,但系统不希望用户直接使用new运算符实例化这些对象,而是应当由系统来控制这些对象的创建,否 ...

  4. 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法

    ref : https://dsqiu.iteye.com/blog/1700312 本文内容框架: §1 Boyer-Moore算法 §2 Horspool算法 §3 Sunday算法 §4 KMP ...

  5. ActiveMQ 消息存储持久化

    ActiveMQ提供了一个插件式的消息存储,类似于消息的多点传播,主要实现了如下几种: AMQ消息存储-基于文件的存储方式,是以前的默认消息存储 KahaDB消息存储-提供了容量的提升和恢复能力,是现 ...

  6. 时间格式_java

    @Test public void testDate(){ Date date=new Date(); System.out.println(date); /*日期格式*/ DateFormat df ...

  7. css 小图标 & iconfont 字体图标

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! iconfont 字体图标 我们的需求中,很多时候会看到一些小的图形,或者叫图标,比如天猫网站中:     ...

  8. hdu 6180贪心

    题意:有m个工程,一台机器在同一时间只能运行一个工程,告诉你每个工程的起始时间和结束时间,求出最少要多少个机器以及最小的机器总运行时间(机器开始了就不能停了,直到用完该台机器才停止). 题解:由于这里 ...

  9. hdu 6143

    题意:有m种字符,要求构造两段长度为n的字符串,其中这两段不能有相同的字符 枚举左边选了i种字符,右边可以选1,2....min(n,m-i)种字符 这样就把问题转化为用k种字符构造n长度的字符串的种 ...

  10. (一)JNDI基础

    一.简介 在Tomcat 4.1.27之后,在服务器上就直接增加了数据源的配置选项,直接在服务器上配置好数据源连接池即可.在J2EE服务器上保存着一个数据库的多个连接.每一个连接通过DataSourc ...