在使用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
相关推荐
1. **数据模型**:Hive 支持两种主要的数据存储结构——表(Table)和分区(Partition)。表是数据的基本单位,可以看作是关系数据库中的表格。分区则是对大表进行逻辑上的划分,通过将数据按特定字段值进行分类,...
在IT行业中,Hive和Spark是两个非常重要的大数据处理框架。Hive主要提供了一种基于Hadoop的数据仓库工具,使得用户可以通过SQL语句对大规模数据进行查询和分析。而Spark则是一个快速、通用且可扩展的大数据处理引擎...
在“hive udaf 实现按位取与或”的场景中,我们主要探讨如何使用UDAF来实现数据的按位逻辑运算,如按位与(AND)和按位或(OR)。 一、Hive UDAF基本概念 UDAF是一种特殊的用户自定义函数,它负责处理一组输入值并...
Hadoop是一个开源框架,主要用于分布式存储和计算大规模数据,而Hive则是建立在Hadoop之上的一种数据仓库工具,它提供了一种SQL-like的查询语言(HQL)来处理和分析大数据。下面将详细介绍这两个组件的安装过程以及...
Hive是大数据处理领域中的一...综上所述,Hive 2.3.3的JDBC驱动和Squirrel-SQL 3.8.1-standard.jar结合使用,为开发者和分析师提供了一种高效、直观的方式来操作和查询Hive数据仓库,极大地增强了对大数据的分析能力。
Hive是专门为处理海量数据而设计的,它构建在Hadoop之上,提供了一种结构化的方式来存储、管理和分析存储在Hadoop分布式文件系统(HDFS)中的非结构化和半结构化数据。Hive的核心特性是其类SQL查询语言HQL(Hive ...
8. **ORC和Parquet格式**:这两种列式存储格式是Hive推荐的数据存储格式,它们提高了数据压缩率和查询性能。 9. **Hive CLI和Beeline**:Hive Command Line Interface(CLI)是Hive的原生交互式命令行工具,而...
3. **Hive开发练习:** - **加载数据到HDFS:** 将日志文件`access.log`和`user.log`加载到HDFS中: ```bash hadoop fs -copyFromLocal ./access.log / hadoop fs -copyFromLocal ./user.log /userlog ``` ...
3. **配置环境变量**:编辑 `/etc/profile` 文件,添加如下两行: ``` export HIVE_HOME=/opt/modules/hive export PATH=$HIVE_HOME/bin:$HIVE_HOME/conf:$PATH ``` 使用 `source /etc/profile` 命令使更改生效...
Hadoop由Apache软件基金会开发,它主要由两个部分组成:Hadoop Distributed File System (HDFS) 和 MapReduce。HDFS是一种分布式文件系统,能存储海量数据,而MapReduce则是一种并行计算模型,用于处理和生成大数据...
这样做的好处在于,相比使用默认的MapReduce执行引擎,Hive on Spark可以提供更快的查询速度和更低的延迟,尤其是在复杂查询或交互式分析场景中。 在安装和配置Spark--bin-hadoop3-without-hive时,你需要确保你的...
这个压缩包中的资料对于准备华为的C/C++技术面试或是希望深入理解这两种语言的开发者来说,是非常有价值的资源。 C语言是计算机科学的基础,它的核心特性包括低级内存操作、高效性能和强大的系统编程能力。在华为的...
Hadoop 2.6是Apache ...在使用过程中,理解并配置Hadoop和Hive的相关配置文件、环境变量以及掌握基本的命令行操作是至关重要的。这不仅有助于你搭建和管理Hadoop集群,还能让你深入理解大数据处理的核心概念和技术。
Windows CE的注册表有两种类型:基于对象存储的注册表和基于HIVE的注册表。在内核定制时,只能选择其中一种。基于对象存储的注册表直接存储在文件系统中,而基于HIVE的注册表存储在一个单独的文件(通常是REGISTRY....
- Java 中有自定义常量和字面值常量两种,字面值常量包括整数、浮点数、字符、字符串、布尔和空值常量。 12. **标识符命名规则**: - Java 中的标识符(如变量、类名等)必须由字母、数字、下划线或美元符号组成...
《Transwarp Data Hub V4.2使用手册1》提供了关于Transwarp Data Hub v4.2 Inceptor的详细指导,这是一款由星环信息科技(上海)有限公司开发的数据处理和分析平台。手册的目的是帮助用户快速理解和掌握Inceptor的...
- **Hadoop伪分布式和完全分布式安装配置**:介绍两种常见的Hadoop部署方式,并给出具体的安装指南。 - **HDFS底层工作原理**:深入探讨HDFS的数据存储机制、副本管理策略以及故障恢复机制。 - **HDFS NameNode和...
对于需要持续更新的数据, Sqoop 提供了两种增量导入方案:基于时间戳和基于序列号。全量导入后,可以跟踪最后一次导入的时间戳或序列号,只导入自上次导入以来更改或新增的数据。 1. 时间戳增量导入: ```bash ...