hive的shell用法(脑子糊涂了,对着脚本第一行是 #!/bin/sh 疯狂执行hive -f 结果报错)
hive脚本的执行方式
hive脚本的执行方式大致有三种:
- hive控制台执行;
- hive -e "SQL"执行;
- hive -f SQL文件执行;
参考hive用法:
- usage: hive
- -d,--define <key=value> Variable subsitution to apply to hive
- commands. e.g. -d A=B or --define A=B
- --database <databasename> Specify the database to use
- -e <quoted-query-string> SQL from command line
- -f <filename> SQL from files
- -H,--help Print help information
- -h <hostname> connecting to Hive Server on remote host
- --hiveconf <property=value> Use value for given property
- --hivevar <key=value> Variable subsitution to apply to hive
- commands. e.g. --hivevar A=B
- -i <filename> Initialization SQL file
- -p <port> connecting to Hive Server on port number
- -S,--silent Silent mode in interactive shell
- -v,--verbose Verbose mode (echo executed SQL to the
- console)
1.1. hive控制台执行
顾名思义,是进入hive控制台以后,执行sql脚本,例如:
- hive> set mapred.job.queue.name=pms;
- hive> select page_name, tpa_name from pms.pms_exps_prepro limit 2;
- Total MapReduce jobs = 1
- Launching Job 1 out of 1
- ...
- Job running in-process (local Hadoop)
- 2015-10-23 10:06:47,756 null map = 100%, reduce = 0%
- 2015-10-23 10:06:48,863 null map = 23%, reduce = 0%
- 2015-10-23 10:06:49,946 null map = 38%, reduce = 0%
- 2015-10-23 10:06:51,051 null map = 72%, reduce = 0%
- 2015-10-23 10:06:52,129 null map = 100%, reduce = 0%
- Ended Job = job_local1109193547_0001
- Execution completed successfully
- Mapred Local Task Succeeded . Convert the Join into MapJoin
- OK
- APP首页 APP首页_价格比京东低
- APP首页 APP首页_价格比京东低
- Time taken: 14.279 seconds
- hive>
1.2. hive -e "SQL"方式执行
利用hive -e "SQL"的方式进入hive控制台并直接执行sql脚本,例如:
- hive -e "
- set mapred.job.queue.name=pms;
- set mapred.job.name=[HQL]exps_prepro_query;
- select page_name, tpa_name
- from pms.pms_exps_prepro
- limit 2;"
1.3. hive -f SQL文件方式执行
执行sql文件中的sql脚本,例如:
pms_exps_prepro.sql文件内容如下:
- set mapred.job.queue.name=pms;
- set hive.exec.reducers.max=48;
- set mapred.reduce.tasks=48;
- set mapred.job.name=[HQL]pms_exps_prepro;
- drop table if exists pms.pms_exps_prepro;
- create table pms.pms_exps_prepro as
- select
- a.provinceid,
- a.cityid,
- a.ieversion,
- a.platform,
- '${date}' as ds
- from track_exps a;
上述文件中的sql脚本接收一个日期,接收参数写法类似${date},执行时如下执行:
date=2015-10-22
hive -f pms_exps_prepro.sql --hivevar date=$date
- date=2015-10-22
- 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脚本:
- select
- *
- from track_exps
- where ds = '2015-10-20'
- and relatedinfo rlike '^4.\d+.\d+.\d+.\d+$'
- and extfield1 rlike '^request.+section-\d+$';
但是由于正则表达式是被包含在sql里面,所以里面的特殊字符需要转义
2.1. hive -e "SQL"的方式执行
改动如下:
- hive -e "
- set mapred.job.queue.name=pms;
- explain select
- cityid
- from track_exps
- where ds = '2015-10-20'
- and relatedinfo rlike '\\^4\\.\\\d\\+\\.\\\d\\+\\.\\\d\\+\\.\\\d\\+\\$'
- and extfield1 rlike '\\^request\\.\\+section\\-\\\d\\+\\$';"
查看执行计划,可以确定正则表达式解析正确了:
- ...
- predicate:
- expr: ((relatedinfo rlike '^4.\d+.\d+.\d+.\d+$') and (extfield1 rlike '^request.+section-\d+$'))
- type: boolean
- ...
分析如下:
在hive -e “SQL"的执行方式中,”‘正则表达式’",正则表达式先被一个单引号括起来,再被一个双引号括起来的,所以正则表达式里面,\^的第一个\用来解析第二个\,第二个\才真正起到了转义的作用
2.2. hive -f SQL文件的方式执行
改动如下:
pms_exps_prepro.sql文件内容如下:
- select
- *
- from track_exps
- where ds = '2015-10-20'
- and relatedinfo rlike '\^4\.\\d\+\.\\d\+\.\\d\+\.\\d\+\$'
- 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.2 位于Shell脚本第一行的#!
学习<shell脚本学习指南>一书,记录总结,便于自己回忆,希望对你有帮助! 2.4 自给自足的脚本:位于第一行的 #! 1.Shell脚本执行过程 当Shell执行一个程序时,会要求UN ...
- shell执行${var:m:n}报错Bad substitution解决办法
Ubuntu系统下,执行字符串截取脚本时,总是报错:Bad substitution,脚本非常简单如下: #!/bin/sh str1="hello world!" :} 执行后报 ...
- shell脚本第一课
shell脚本的文件名一般是以.sh结尾,也可以以其他格式如.txt,甚至不加后缀. 脚本的第一行的#!/bin/bash表示指定脚本执行时的解析器. #!/bin/bash #文件名:test.sh ...
- Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient报错,问题排查
背景 最近在整合pyspark与hive,新安装spark-2.3.3以客户端的方式访问hive数据,运行方式使用spark on yarn,但是在配置spark读取hive数据的时候,这里直接把hi ...
- Linux编程 9 (shell类型,shell父子关系,子shell用法)
一. shell类型 1.1 交互式 bin/ shell程序 当用户登录到某个虚拟控制台终端或是在GUI中启动终端仿真器时,默认的shell程序就会开始运行.系统启动什么样的shell程序取决于你 ...
- Hive学习之路 (十八)Hive的Shell操作
一.Hive的命令行 1.Hive支持的一些命令 Command Description quit Use quit or exit to leave the interactive shell. s ...
- Hive(八)Hive的Shell操作与压缩存储
一.Hive的命令行 1.Hive支持的一些命令 Command Description quit Use quit or exit to leave the interactive shell. s ...
- Hive 基本语法操练(五):Hive 的 JOIN 用法
Hive 的 JOIN 用法 hive只支持等连接,外连接,左半连接.hive不支持非相等的join条件(通过其他方式实现,如left outer join),因为它很难在map/reduce中实现这 ...
- Hive row_number() 等用法
1.row_number() over()排序功能: (1) row_number() over()分组排序功能: 在使用 row_number() over()函数时候,over()里头的分组以及排 ...
随机推荐
- 解决Windows7下virtualbox安装ubuntu出现的0x00000000指令引用0x00000000内存,该内存不能为written问题
公司电脑只能用Windows7,不能用10,也没WSL用,最近想跑个Linux环境,因为之前装docker toolbox装了virtualbox,没道理再装vmware,遂用vbox开始折腾,没想到 ...
- Spring IoC 详解(四)
Spring IoC 概述 IoC:Inverse of Control(控制反转) 为了更好的理解用可以这样通俗易懂的这样讲:IOC主要是说是new一个类来使用,方式分为:开发这手动创建和Sprin ...
- Java的设计模式(4)--抽象工厂模式
提供一个创建一系列或相互依赖对象的接口,而无须指定他们具体的类.例如某些系统可能需要为用户提供一系列相关对象,但系统不希望用户直接使用new运算符实例化这些对象,而是应当由系统来控制这些对象的创建,否 ...
- 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法
ref : https://dsqiu.iteye.com/blog/1700312 本文内容框架: §1 Boyer-Moore算法 §2 Horspool算法 §3 Sunday算法 §4 KMP ...
- ActiveMQ 消息存储持久化
ActiveMQ提供了一个插件式的消息存储,类似于消息的多点传播,主要实现了如下几种: AMQ消息存储-基于文件的存储方式,是以前的默认消息存储 KahaDB消息存储-提供了容量的提升和恢复能力,是现 ...
- 时间格式_java
@Test public void testDate(){ Date date=new Date(); System.out.println(date); /*日期格式*/ DateFormat df ...
- css 小图标 & iconfont 字体图标
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! iconfont 字体图标 我们的需求中,很多时候会看到一些小的图形,或者叫图标,比如天猫网站中: ...
- hdu 6180贪心
题意:有m个工程,一台机器在同一时间只能运行一个工程,告诉你每个工程的起始时间和结束时间,求出最少要多少个机器以及最小的机器总运行时间(机器开始了就不能停了,直到用完该台机器才停止). 题解:由于这里 ...
- hdu 6143
题意:有m种字符,要求构造两段长度为n的字符串,其中这两段不能有相同的字符 枚举左边选了i种字符,右边可以选1,2....min(n,m-i)种字符 这样就把问题转化为用k种字符构造n长度的字符串的种 ...
- (一)JNDI基础
一.简介 在Tomcat 4.1.27之后,在服务器上就直接增加了数据源的配置选项,直接在服务器上配置好数据源连接池即可.在J2EE服务器上保存着一个数据库的多个连接.每一个连接通过DataSourc ...