如何每日增量加载数据到Hive分区表

本文介绍了一种通过Shell脚本实现Hive分区表每日增量加载的方法。具体步骤包括使用for循环遍历日志文件,利用Linux字符串截取功能解析日期和小时,再通过Hive SQL脚本将数据加载到指定分区。

如何每日增量加载数据到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

转载于:https://www.cnblogs.com/raymoc/p/5321851.html

Spark可以从MySQL中提取增量数据并存储到Hive中,通常通过以下几个步骤来实现: 1. **连接数据库**:首先,你需要安装Spark SQL库,并配置连接到MySQL的数据源,可以使用`spark.read.format("jdbc")`来指定JDBC读取方式。 ```scala val df = spark.read.format("jdbc") .option("url", "jdbc:mysql://[mysql_host]:[port]/database_name") .option("dbtable", "[table_name]") .option("user", "[username]") .option("password", "[password]") .load() ``` 记得替换上述代码中的占位符为实际的数据库连接信息。 2. **设置动态分区**:如果你需要获取特定时间范围内的增量数据,可以在SQL查询中使用`PARTITION BY`子句加上时间戳列,如`partitionDate`, 然后只选择大于某个特定值的记录。 ```sql SELECT * FROM table_name WHERE partitionDate > 'your_date_threshold' ``` 3. **创建临时表**:将结果保存到一个新的Spark DataFrame,然后将其转换为Hive分区表格式,这将自动处理增量加载。 ```scala df.createOrReplaceTempView("temp_table") // 将DataFrame转换为Hive分区表 spark.sql( """ CREATE TABLE IF NOT EXISTS my_hive_table ( ... // 表结构 ) PARTITIONED BY (partitionDate STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE TBLPROPERTIES ('orc.compress'='snappy') AS SELECT * FROM temp_table """ ) ``` 4. **触发写入Hive**:最后,你可以定期运行这个过程,比如每天定时任务,来获取MySQL的新增数据并更新Hive表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值