抽取 db 库中 table4 的增量数据进入 Hive 的 ods 库中表 table4,增量字段 取 ods.table4 表中 time1、time2 中的最大者,只将新增的数据抽入,字段 名称、类型不变,同时添加静态分区,分区字段为 etl_date,类型为 String, 且值为当前比赛日的前一天日期(分区字段格式为 yyyyMMdd)。用纯sql语法详细步骤代码
时间: 2023-06-13 11:08:08 浏览: 189
假设 db 库的连接信息为:db_host、db_port、db_name、db_user、db_password,Hive 的连接信息为:hive_host、hive_port、hive_database、hive_user、hive_password。
1. 创建 ods 库和 table4 表,添加静态分区 etl_date:
```sql
CREATE DATABASE IF NOT EXISTS ods;
USE ods;
CREATE TABLE IF NOT EXISTS table4 (
id INT,
name STRING,
age INT,
time1 TIMESTAMP,
time2 TIMESTAMP
)
PARTITIONED BY (etl_date STRING);
```
2. 抽取增量数据,注意只抽取新增数据:
```sql
INSERT INTO TABLE ods.table4 PARTITION(etl_date='${hiveconf:etl_date}')
SELECT id, name, age, time1, time2
FROM db.table4
WHERE time1 > (
SELECT MAX(time1) FROM ods.table4 WHERE etl_date='${hiveconf:etl_date}'
) OR time2 > (
SELECT MAX(time2) FROM ods.table4 WHERE etl_date='${hiveconf:etl_date}'
);
```
3. 设置 etl_date 参数为当前比赛日的前一天日期,格式为 yyyyMMdd:
```sql
SET hiveconf:etl_date = FROM_UNIXTIME(UNIX_TIMESTAMP()-86400, 'yyyyMMdd');
```
完整的 SQL 代码如下:
```sql
-- 创建 ods 库和 table4 表,添加静态分区 etl_date
CREATE DATABASE IF NOT EXISTS ods;
USE ods;
CREATE TABLE IF NOT EXISTS table4 (
id INT,
name STRING,
age INT,
time1 TIMESTAMP,
time2 TIMESTAMP
)
PARTITIONED BY (etl_date STRING);
-- 设置 etl_date 参数为当前比赛日的前一天日期,格式为 yyyyMMdd
SET hiveconf:etl_date = FROM_UNIXTIME(UNIX_TIMESTAMP()-86400, 'yyyyMMdd');
-- 抽取增量数据,注意只抽取新增数据
INSERT INTO TABLE ods.table4 PARTITION(etl_date='${hiveconf:etl_date}')
SELECT id, name, age, time1, time2
FROM db.table4
WHERE time1 > (
SELECT MAX(time1) FROM ods.table4 WHERE etl_date='${hiveconf:etl_date}'
) OR time2 > (
SELECT MAX(time2) FROM ods.table4 WHERE etl_date='${hiveconf:etl_date}'
);
```
阅读全文