hive脚本编写
⑴ 如何每日增量加载数据到Hive分区表
加载数据
数据加载到Hive分区表(两个分区,日期(20160316)和小时(10))中
每日加载前一天的日志文件数据到表db_track.track_log
1.
数据存储
数据日志文件,放入某个目录下,每天日志文件放入同一个目录
eg:
20160316
-
目录名称
日志文件数据,每个小时生成一个文件,一天总共有二十四个文件
eg:
2016031820
2.
shell脚本编写
负责调度的shell脚本load_tracklogs.sh
注:这里涉及到了两个点:1)for循环
2)
linux下字符串的截取${line:0:4}
3)
传递参数到hive的sql脚本
#!/bin/sh
##
环境变量生效
.
/etc/profile
##
HIVE
HOME
HIVE_HOME=/opt/cdh5.3.6/hive-0.13.1-cdh5.3.6
##
日志目录
LOG_DIR=/data/tracklogs
##
目录名称,
依据日期date获取
yesterday=`date
-d
-1days
'+%Y%m%d'`
###
for
line
in
`ls
$LOG_DIR/${yesterday}`
do
echo
"loading
$line
.............."
#从文件名称中解析出日期和小时
daily=${line:0:4}${line:4:2}${line:6:2}
hour=${line:8:2}
LOAD_FILE=${LOG_DIR}/${yesterday}/${line}
###
echo
$daily
+
$hour
###
${HIVE_HOME}/bin/hive
-e
"LOAD
DATA
LOCAL
INPATH
'${LOAD_FILE}'
OVERWRITE
INTO
TABLE
db_track.track_log
PARTITION(date
=
'${daily}',
hour
=
'${hour}')
;"
${HIVE_HOME}/bin/hive
--hiveconf
LOAD_FILE_PARAM=${LOAD_FILE}
--hiveconf
daily_param=${daily}
--hiveconf
hour_param=${hour}
-f
/home/hadoop/load_data.sql
done
负责加载数据的sql脚本
注:
怎么在HQL脚本中获取外接传递的参数
LOAD
DATA
LOCAL
INPATH
'${hiveconf:LOAD_FILE_PARAM}'
OVERWRITE
INTO
TABLE
db_track.track_log
PARTITION(date
=
'${hiveconf:daily_param}',
hour
=
'${hiveconf:hour_param}')
;
制定每天定时执行
可以在当前用户下直接创建:crontab
-e
注:crontab中的五个
*号分别代表分,时,日,月,周,下面的例子就是每天晚上1点30运行任务的例子,注意sh命令前一般需要加上绝对路径
#
LODAD
DATA
INTO
TRACK_LOG
30
1
*
*
*
/bin/sh
/home/hadoop/load_tracklogs.sh
⑵ 在hive查询中使用变量
Hive配置属性存储于 hiveconf 命名空间中,该命名空间中的属性是可读写的。在查询语句中插入 '${hiveconf:变量名}' ,就可以通过 hive -hiveconf来替换变量。例如,查询语句和执行方式如下:
需要注意的是:
Hive命令行变量,存储于 hivevar 命名空间中,该命名空间中的变量是可读写的。使用方式和hive配置属性类似,只是在查询语句中插入的是 '${hivecar:变量名}' ,其中命名空间"hivecar:"可以省略。例如:
因为命令行变量的命名空间是唯一可以省略的,因此:
其他替换变量的方法:
利用shell脚本设置hive查询语句中的变量
利用Python替换Hive查询语句中的变量
⑶ hive中 建索引可以添加if not exists 吗我想在脚本中判断索引表是否存在
如何创建索引 : 使用T-SQL语句创建索引的语法: CREATE [UNIQUE] [CLUSTERED|NONCLUSTERED] INDEX index_name ON table_name (column_name…) [WITH FILLFACTOR=x] UNIQUE表示唯一索引,可选 CLUSTERED、NONCLUSTERED表示聚集索引还是非聚集索引,可选 FILLFACTOR表示填充因子,指定一个0到依00之间的值,该值指示索引页填满的空间所占的百分比 在stuMarks表的writtenExam列创建索引: USE stuDB GO IF EXISTS (SELECT name FROM sysindexes WHERE name = 'IX_writtenExam') DROP INDEX stuMarks.IX_writtenExam /*--笔试列创建非聚集索引:填充因子为三0%--*/ CREATE NONCLUSTERED INDEX IX_writtenExam ON stuMarks(writtenExam) WITH FILLFACTOR= 三0 GO /*-----指定按索引 IX_writtenExam 查询----*/ SELECT * FROM stuMarks (INDEX=IX_writtenExam) WHERE writtenExam BETWEEN 陆0 AND 90 虽然我们可以指定SQL Server按哪个索引进行数据查询,但一般不需要我们人工指定。SQL Server将会根据我们创建的索引,自动优化查询