`
zhangxiong0301
  • 浏览: 358951 次
社区版块
存档分类
最新评论

Hive开发中使用变量的两种方法

    博客分类:
  • HIVE
 
阅读更多

在使用hive开发数据分析代码时,经常会遇到需要改变运行参数的情况,比如select语句中对日期字段值的设定,可能不同时间想要看不同日期的数据,这就需要能动态改变日期的值。如果开发量较大、参数多的话,使用变量来替代原来的字面值非常有必要,本文总结了几种可以向hive的SQL中传入参数的方法,以满足类似的需要。

准备测试表和测试数据

第一步先准备测试表和测试数据用于后续测试:

hive> create database test;
OK
Time taken: 2.606 seconds

然后执行建表和导入数据的sql文件:

[czt@www.crazyant.net testHivePara]$ hive -f student.sql 
Hive history file=/tmp/crazyant.net/hive_job_log_czt_201309131615_1720869864.txt
OK
Time taken: 2.131 seconds
OK
Time taken: 0.878 seconds
Copying data from file:/home/users/czt/testdata_student
Copying file: file:/home/users/czt/testdata_student
Loading data to table test.student
OK
Time taken: 1.76 seconds

其中student.sql内容如下:

use test; 

---学生信息表
create table IF NOT EXISTS student(
sno		bigint	comment '学号' , 
sname	string	comment '姓名' , 
sage	bigint	comment '年龄' ,
pdate	string	comment '入学日期'
)
COMMENT '学生信息表'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;

LOAD DATA LOCAL INPATH 
'/home/users/czt/testdata_student'
INTO TABLE student;

testdata_student测试数据文件内容如下:

1	name1	21	20130901
2	name2	22	20130901
3	name3	23	20130901
4	name4	24	20130901
5	name5	25	20130902
6	name6	26	20130902
7	name7	27	20130902
8	name8	28	20130902
9	name9	29	20130903
10	name10	30	20130903
11	name11	31	20130903
12	name12	32	20130904
13	name13	33	20130904

方法1:shell中设置变量,hive -e中直接使用

测试的shell文件名:

#!/bin/bash
tablename="student"
limitcount="8"

hive -S -e "use test; select * from ${tablename} limit ${limitcount};"

运行结果:

[czt@www.crazyant.net testHivePara]$ sh -x shellhive.sh 
+ tablename=student
+ limitcount=8
+ hive -S -e 'use test; select * from student limit 8;'
1       name1    21      20130901
2       name2    22      20130901
3       name3    23      20130901
4       name4    24      20130901
5       name5    25      20130902
6       name6    26      20130902
7       name7    27      20130902
8       name8    28      20130902

由于hive自身是类SQL语言,缺乏shell的灵活性和对过程的控制能力,所以采用shell+hive的开发模式非常常见,在shell中直接定义变量,在hive -e语句中就可以直接引用;

注意:使用-hiveconf定义,在hive -e中是不能使用的

修改一下刚才的shell文件,采用-hiveconf的方法定义日期参数:

#!/bin/bash
tablename="student"
limitcount="8"

hive -S \
-hiveconf enter_school_date="20130902" \
-hiveconf min_age="26" \
-e \
"	use test; \
select * from ${tablename} \
where \ 
pdate='${hiveconf:enter_school_date}' \ 
and \ 
sage>'${hiveconf:min_age}' \ 
limit ${limitcount};"

 

运行时该SQL语句会被解析成下面这个样子:

+ hive -S -hiveconf enter_school_date=20130902 -hiveconf min_age=26 -e 'use test; explain select * from student where pdate='\'''\'' and sage>'\'''\'' limit 8;'

 

方法2:使用-hiveconf定义,在SQL文件中使用

因为换行什么的很不方便,hive -e只适合写少量的SQL代码,所以一般都会写很多hql文件,然后使用hive –f的方法来调用,这时候可以通过-hiveconf定义一些变量,然后在SQL中直接使用。

先编写调用的SHELL文件:

#!/bin/bash

hive -hiveconf enter_school_date="20130902" -hiveconf min_ag="26" -f testvar.sql

 

use test; 

select * from student
where 
pdate='${hiveconf:enter_school_date}' 
and
sage > '${hiveconf:min_ag}'
limit 8;

 

[czt@www.crazyant.net testHivePara]$ sh -x shellhive.sh 
+ hive -hiveconf enter_school_date=20130902 -hiveconf min_ag=26 -f testvar.sql
Hive history file=/tmp/czt/hive_job_log_czt_201309131651_2035045625.txt
OK
Time taken: 2.143 seconds
Total MapReduce jobs = 1
Launching Job 1 out of 1
Number of reduce tasks is set to 0 since there's no reduce operator
Kill Command = hadoop job -kill job_20130911213659_42303
2013-09-13 16:52:00,300 Stage-1 map = 0%,  reduce = 0%
2013-09-13 16:52:14,609 Stage-1 map = 28%,  reduce = 0%
2013-09-13 16:52:24,642 Stage-1 map = 71%,  reduce = 0%
2013-09-13 16:52:34,639 Stage-1 map = 98%,  reduce = 0%
Ended Job = job_20130911213659_42303
OK
7       name7   27      20130902
8       name8   28      20130902
Time taken: 54.268 seconds

总结

本文主要阐述了两种在hive中使用变量的方法,第一种是在shell中定义变量然后在hive -e的SQL语句中直接用${var_name}的方法调用;第二种是使用hive –hiveconf key=value –f run.sql模式使用-hiveconf来设置变量,然后在SQL文件中使用${hiveconf:varname}的方法调用。用这两种方法可以满足开发的时候向hive传递参数的需求,会很好的提升开发效率和代码质量。

 

 

 

-S选项
    hive执行过程中,会在终端上显示mapreduce的进度。如果不想显示进度,可以使用-S选项。
这个静音模式很实用,,通过第三方程序调用,第三方程序通过hive的标准输出获取结果集。
    eg:$HIVE_HOME/bin/hive -S -e 'select a.col from tab1 a' > tab1.csv

分享到:
评论

相关推荐

    apache-hive-2.3.9-bin.tar大数据HIVE.zip

    1. **数据模型**:Hive 支持两种主要的数据存储结构——表(Table)和分区(Partition)。表是数据的基本单位,可以看作是关系数据库中的表格。分区则是对大表进行逻辑上的划分,通过将数据按特定字段值进行分类,...

    hive3.x编译spark3.x包

    在IT行业中,Hive和Spark是两个非常重要的大数据处理框架。Hive主要提供了一种基于Hadoop的数据仓库工具,使得用户可以通过SQL语句对大规模数据进行查询和分析。而Spark则是一个快速、通用且可扩展的大数据处理引擎...

    hive udaf 实现按位取与或

    在“hive udaf 实现按位取与或”的场景中,我们主要探讨如何使用UDAF来实现数据的按位逻辑运算,如按位与(AND)和按位或(OR)。 一、Hive UDAF基本概念 UDAF是一种特殊的用户自定义函数,它负责处理一组输入值并...

    hadoop+hive环境安装包.rar

    Hadoop是一个开源框架,主要用于分布式存储和计算大规模数据,而Hive则是建立在Hadoop之上的一种数据仓库工具,它提供了一种SQL-like的查询语言(HQL)来处理和分析大数据。下面将详细介绍这两个组件的安装过程以及...

    hive 2.3.3 的jdbc 和 squirrel-sql-3.8.1-standard.jar 包

    Hive是大数据处理领域中的一...综上所述,Hive 2.3.3的JDBC驱动和Squirrel-SQL 3.8.1-standard.jar结合使用,为开发者和分析师提供了一种高效、直观的方式来操作和查询Hive数据仓库,极大地增强了对大数据的分析能力。

    java大数据内容_6Hive、Kettle

    Hive是专门为处理海量数据而设计的,它构建在Hadoop之上,提供了一种结构化的方式来存储、管理和分析存储在Hadoop分布式文件系统(HDFS)中的非结构化和半结构化数据。Hive的核心特性是其类SQL查询语言HQL(Hive ...

    apache-hive-3.1.2-bin.tar.zip

    8. **ORC和Parquet格式**:这两种列式存储格式是Hive推荐的数据存储格式,它们提高了数据压缩率和查询性能。 9. **Hive CLI和Beeline**:Hive Command Line Interface(CLI)是Hive的原生交互式命令行工具,而...

    java大数据案例_6Hive、Kettle

    3. **Hive开发练习:** - **加载数据到HDFS:** 将日志文件`access.log`和`user.log`加载到HDFS中: ```bash hadoop fs -copyFromLocal ./access.log / hadoop fs -copyFromLocal ./user.log /userlog ``` ...

    基于大数据集群的hive搭建

    3. **配置环境变量**:编辑 `/etc/profile` 文件,添加如下两行: ``` export HIVE_HOME=/opt/modules/hive export PATH=$HIVE_HOME/bin:$HIVE_HOME/conf:$PATH ``` 使用 `source /etc/profile` 命令使更改生效...

    hadoop安装文件.rar,内涵hadoop安装的步骤word,hadoop、hive、hbase、sqoop、mysql等

    Hadoop由Apache软件基金会开发,它主要由两个部分组成:Hadoop Distributed File System (HDFS) 和 MapReduce。HDFS是一种分布式文件系统,能存储海量数据,而MapReduce则是一种并行计算模型,用于处理和生成大数据...

    spark--bin-hadoop3-without-hive.tgz

    这样做的好处在于,相比使用默认的MapReduce执行引擎,Hive on Spark可以提供更快的查询速度和更低的延迟,尤其是在复杂查询或交互式分析场景中。 在安装和配置Spark--bin-hadoop3-without-hive时,你需要确保你的...

    华为面试题集

    这个压缩包中的资料对于准备华为的C/C++技术面试或是希望深入理解这两种语言的开发者来说,是非常有价值的资源。 C语言是计算机科学的基础,它的核心特性包括低级内存操作、高效性能和强大的系统编程能力。在华为的...

    hadoop2.6_windows_x64.zip

    Hadoop 2.6是Apache ...在使用过程中,理解并配置Hadoop和Hive的相关配置文件、环境变量以及掌握基本的命令行操作是至关重要的。这不仅有助于你搭建和管理Hadoop集群,还能让你深入理解大数据处理的核心概念和技术。

    WinCE定制中的大内存支持与永久保存注册表

    Windows CE的注册表有两种类型:基于对象存储的注册表和基于HIVE的注册表。在内核定制时,只能选择其中一种。基于对象存储的注册表直接存储在文件系统中,而基于HIVE的注册表存储在一个单独的文件(通常是REGISTRY....

    数据分析师培训课程中老师传授的亲身经验.docx

    - Java 中有自定义常量和字面值常量两种,字面值常量包括整数、浮点数、字符、字符串、布尔和空值常量。 12. **标识符命名规则**: - Java 中的标识符(如变量、类名等)必须由字母、数字、下划线或美元符号组成...

    Transwarp Data Hub V4.2使用手册1

    《Transwarp Data Hub V4.2使用手册1》提供了关于Transwarp Data Hub v4.2 Inceptor的详细指导,这是一款由星环信息科技(上海)有限公司开发的数据处理和分析平台。手册的目的是帮助用户快速理解和掌握Inceptor的...

    大数据课程体系.docx

    - **Hadoop伪分布式和完全分布式安装配置**:介绍两种常见的Hadoop部署方式,并给出具体的安装指南。 - **HDFS底层工作原理**:深入探讨HDFS的数据存储机制、副本管理策略以及故障恢复机制。 - **HDFS NameNode和...

    大数据开发中的Sqoop学习笔记(自己整理版).pdf

    对于需要持续更新的数据, Sqoop 提供了两种增量导入方案:基于时间戳和基于序列号。全量导入后,可以跟踪最后一次导入的时间戳或序列号,只导入自上次导入以来更改或新增的数据。 1. 时间戳增量导入: ```bash ...

Global site tag (gtag.js) - Google Analytics