hive传递参数与调用(hive SQL 脚本传参)

在运行hive命令时传入参数,使用-hivevar 和 -hiveconf 两种参数选项,来给此次的执行脚本传入参数

-hivevar : 传参数 ,专门提供给用户自定义变量。

-hiveconf : 传参数,包括了hive-site.xml中配置的hive全局变量。

(1)脚本调用

test.sql

use default;
select 
'${hiveconf:month}' as month
from default.user1;

start.sh

#!/bin/sh
#ecoding=utf-8

set -x
month=`date -d 'last month' +%Y-%m`
hive --hiveconf month=$month -f test.sql

(2)直接传参

hive -f 参数传递,执行文件

命令: hive --hivevar v_date='20170630' -S -f test1.hql – 返回3条记录

命令: hive --hivevar v_date='20170101' -S -f test1.hql – 返回0条记录

FI集群:

  命令: `beeline --hivevar v_date='20170630' -S -f test1.hql`    -- 返回3条记录

查看文件内容:

cat test1.hql
use default; select * from logs where dt='${hivevar:v_date}' limit 3;
cat test2.hql 
use default; select * from logs limit 3;

-------------------------------------------------------更正规的解释------------------------------------------------------

1. hiveconf

hiveconf用于定义HIVE执行上下文的属性(配置参数),可覆盖覆盖hive-site.xml(hive-default.xml)中的参数值,如用户执行目录、日志打印级别、执行队列等,常用的配置属性如下:

参数名称 参数解释
hive.metastore.warehouse.dir 启动时指定用户目录,不同的用户不同的目录
hive.cli.print.current.db 显示当前数据库
hive.root.logger 输出日志信息
hive.cli.print.header 显示列名称
mapred.job.queue.name 执行队列名称

如果熟悉HIVE操作的话,这些配置属性还可以利用“set”指令进行修正,如下:

# 首先启动HIVE
hive
# 然后设置参数
set mapred.job.queue.name=root.default
上面的指令可等价于“hive --hiveconf”命令,如下:

hive --hiveconf "mapred.job.queue.name=root.default"

2. hivevar

hivevar用于定义HIVE运行时的变量替换,类似于JAVA中的“PreparedStatement”,与“${}”配合使用,示例如下:

#  定义变量,并启动HIVE CLI
hive  --hivevar my="201809" --database deafult -e 'select * from a1 where concat(year, month) = ${my} limit 10';
  1. define
    define与hivevar用途完全一样,还有一种简写“-d”,示例如下:
#   定义变量
hive --hiveconf "mapred.job.queue.name=root.default" -d my="201809" --database default -e
'select * from mydb where concat(year, month) = ${my} limit 10';
<think>好的,用户现在想了解如何在Hive SQL传递参数。之前我回答过关于Hive的collect_list函数的问题,用户现在的新问题涉及到Hive脚本参数传递。我需要根据用户提供的引用内容,以及之前的对话历史,来组织回答。 首先,我需要回忆用户提供的两个引用内容。引用1提到了使用--hiveconf来传递参数,例如在命令行中使用-d定义变量,并在SQL中通过${my}引用。引用2详细列出了Hive的命令行参数,包括--define、--hiveconf、--hivevar等,以及它们的用法。这些信息需要整合到回答中。 接下来,用户的上一个问题中,我详细讲解了collect_list的用法,现在用户转向参数传递,可能需要分步骤的说明,包括不同的传参方法、示例以及注意事项。需要确保回答结构清晰,步骤明确,符合用户要求的“帮助用户逐步解决问题”。 用户可能的需求场景是什么?可能是需要在Hive脚本中动态传入日期、分区参数或者过滤条件,以便重复使用脚本而不必每次修改SQL文件。例如,按月份查询数据,或者根据不同的地区生成报表。因此,回答中需要覆盖多种传参方式,并给出实际应用的例子,方便用户理解不同方法的适用场景。 另外,用户提供的引用中提到了--hiveconf、--define、--hivevar,这些需要详细区分,说明它们的异同点。例如,--hivevar和--define是等价的,而--hiveconf用于设置Hive的配置属性,但也可以用来传参。需要指出在SQL中如何引用这些变量,比如${hivevar:var}、${var}的形式。 还要注意不同传参方式的优先级问题,用户可能需要了解在同时使用多种方式时,哪个参数会生效。例如,命令行参数会覆盖配置文件中的设置,这一点需要提及。 此外,用户可能关心如何在脚本文件中使用这些参数,比如在.hql文件中通过${}来引用,以及在命令行中如何传递。需要给出具体的示例,比如通过-f执行脚本文件时如何附带参数。 最后,注意事项部分需要提醒用户变量名的大小写敏感问题,参数值的类型(如字符串需要引号),以及安全性方面的考虑,比如避免SQL注入。同时,结合之前回答中的collect_list,可以建议在动态构造数组或处理分组时使用参数传递,提高脚本的灵活性。 总结一下,回答的结构应该是:简介传参的需求,分点讲解不同的传参方法(命令行、脚本内部定义、配置文件),每个方法给出语法和示例,然后讨论变量的引用范围优先级,最后是注意事项和常见问题。相关问题部分可以引导用户进一步探索,比如参数传递的性能影响,或者在复杂查询中的应用。</think>#### Hive SQL参数传递方法详解 Hive SQL支持通过**命令行参数**、**脚本内定义变量**、**配置文件**三种方式传递参数,以下是具体方法及使用场景: --- ### 一、命令行传参(最常用) #### 1. 通过`--hiveconf`传递 **语法**: ```bash hive --hiveconf <key>=<value> -f script.hql ``` **示例**: ```bash hive --hiveconf "target_year=2023" --hiveconf "city=shanghai" -f analysis.hql ``` **SQL引用方式**: ```sql SELECT * FROM sales WHERE year = ${hiveconf:target_year} AND region = '${hiveconf:city}'; ``` #### 2. 通过`--hivevar`或`-d`传递 (`--hivevar``-d`等效) ```bash hive --hivevar month=08 -d day=15 -e "SELECT * FROM logs WHERE dt='${hivevar:month}-${day}'" ``` **SQL中直接调用**: 使用`${变量名}`简写格式(需Hive 0.8.1+) --- ### 二、脚本内定义变量 #### 1. `SET`命令定义 ```sql SET hivevar:department = '大数据部'; SELECT * FROM employees WHERE dept = '${department}'; ``` #### 2. 嵌套Shell变量 通过`!`执行Shell命令获取值: ```sql SET hivevar:current_date = `!echo $(date +"%Y%m%d")`; SELECT * FROM orders WHERE order_date = '${current_date}'; ``` --- ### 三、配置文件传参 创建`config.properties`文件: ```properties # 配置文件 start_date=20230101 end_date=20231231 ``` **启动时加载配置**: ```bash hive --hivevar:config=config.properties -f report.hql ``` **SQL调用**: ```sql SELECT * FROM transactions WHERE dt BETWEEN '${config:start_date}' AND '${config:end_date}'; ``` --- ### 四、变量作用域优先级 | 参数类型 | 生效范围 | 优先级 | |----------------|-----------------|--------| | 命令行参数 | 全局 | 最高 | | 脚本内SET定义 | 当前会话 | 中 | | 配置文件参数 | 依赖加载顺序 | 最低 | --- ### 五、使用场景示例 #### 动态分区过滤 ```bash hive --hivevar partition=2023-08 -e " SELECT user_id, SUM(amount) FROM orders WHERE dt='${partition}' GROUP BY user_id" ``` #### 字段动态映射 ```sql SET hivevar:score_column = 'math_score'; SELECT name, AVG(${score_column}) FROM student_scores GROUP BY name; ``` --- ### 六、注意事项 1. **类型处理**:字符串参数需加引号 `--hivevar city="'shanghai'"` → SQL中直接使用`${city}` 2. **安全验证**:参数值中若包含特殊字符(如空格),需用双引号包裹 `--hivevar query_criteria="price > 100 AND category='books'"` 3. **性能优化**:避免在`WHERE`条件中频繁使用动态参数,可能影响执行计划复用[^2] 4. **错误排查**:使用`SET -v;`命令可查看所有已定义变量 --- ### 相关问题 1. 如何防止Hive SQL参数注入攻击? 2. 动态参数传递Hive执行计划有什么影响? 3. 如何在Hive UDF中接收外部参数? [^1]: Hive参数传递支持三种方式,包括命令行、脚本内定义和配置文件 [^2]: 动态参数可能影响查询优化器的执行计划选择
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值