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. 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. RabbitMQ的安装(Windows环境下)

    在使用RabbitMQ之前,先知道什么是AMQP,AMQP 即 Advanced Message Queuing Protocol ,又叫高级消息队列协议,是应用层协议的一个开放标准,其主要特征是面向 ...

  2. EMR目录

    EMR目录: E-MapReduce 是阿里云上的开源大数据平台,用户可以登录集群主节点查看相关安装路径. 登录后也可以使用 env |grep xxx 查看. 或者,在EMR Hadoop集群,切换 ...

  3. [转帖]当 K8s 集群达到万级规模,阿里巴巴如何解决系统各组件性能问题?

    改天学习一下. https://www.cnblogs.com/alisystemsoftware/p/11570806.html   当 K8s 集群达到万级规模,阿里巴巴如何解决系统各组件性能问题 ...

  4. python 脚本备份mssql数据库并删除数据库

    一.实现脚本 # -*- coding=utf-8 -*- import pyodbc from datetime import datetime import pymssql import os i ...

  5. 【C++札记】命名空间(namespace)

    介绍 命名空间可以解决程序中的同名冲突,尤其大型项目多人开发中经常用到.比如我们使用C++的标准输出std::cout就使用了std命名空间. 使用作用域符:: #include <iostre ...

  6. PAT(B) 1019 数字黑洞(Java)

    题目链接:1019 数字黑洞 (20 point(s)) 分析 输入正整数n后,将n转成int型数组nArr[4] 用Arrays.sort(int[] a)方法将数组nArr非递减排序 很显然,非递 ...

  7. MogileFS表说明

    MogileFS大致的表说明如下 checksum:用来存放文件的校验和class:文件分类定义device:主机上的可用设备定义,包括设备可用空间,使用的权重等信息domain:域定义信息file: ...

  8. Windows计划任务无法写Log的问题

    参照:https://www.cnblogs.com/jonezzz/p/10364153.html 使用WIndows计划任务去执行Exe文件时无法写Log,而Exe双击执行就能写Log,这是由于计 ...

  9. Spring邮件服务:Maven + Spring SMTP Mail (可发送附件)

    1  spring-smtp-mail.xml <?xml version="1.0" encoding="UTF-8"?> <beans x ...

  10. (十二) web服务与javaweb结合(3)

    一.需求 上一章节虽然将webservice和web项目绑定在了一起,但是还是不能共同一个端口,本章讲解webservice和web项目绑定且共同端口. 二.案例 2.1 创建web工程,并引入依赖 ...