如何以`tbdlf fsimage accesstime`列为参数将单表数据拆分到不同目标表
Hue SQL 按访问时间拆分数据到多表操作方案
前置检查
- 先确认3张目标表已创建,表结构和源表完全一致。若未创建可执行以下语句快速生成,替换
源表名为你的实际表名:
CREATE TABLE `近15天访问` LIKE 源表名; CREATE TABLE `近30天访问` LIKE 源表名; CREATE TABLE `超过30天未访问` LIKE 源表名;
- 确认
tbdlf fsimage accesstime字段的格式:- 若为日期/时间戳类型可直接计算
- 若为
yyyy-MM-dd格式字符串,需用to_date(tbdlf fsimage accesstime)转换 - 若为10位秒级时间戳,需用
to_date(from_unixtime(cast(tbdlf fsimage accesstimeas bigint)))转换
最优实现:单趟多插入(仅扫描一次源表,性能最好)
直接在Hue Query Editor中执行以下Hive SQL即可,替换对应占位符:
FROM 源表名 -- 插入近15天数据 INSERT INTO TABLE `近15天访问` SELECT * WHERE datediff(current_date(), to_date(`tbdlf fsimage accesstime`)) <= 15 -- 插入16-30天数据 INSERT INTO TABLE `近30天访问` SELECT * WHERE datediff(current_date(), to_date(`tbdlf fsimage accesstime`)) BETWEEN 16 AND 30 -- 插入超过30天未访问数据 INSERT INTO TABLE `超过30天未访问` SELECT * WHERE datediff(current_date(), to_date(`tbdlf fsimage accesstime`)) > 30;
如果你用的是Impala引擎,只需把
current_date()替换为now()::date即可,其余语法一致。
分步实现(适合需要逐段验证逻辑的场景)
如果担心一次性执行出错,可分3次执行单表插入,每步执行后可先查目标表数据量验证正确性:
- 插入近15天数据:
INSERT INTO近15天访问SELECT * FROM 源表名 WHERE datediff(current_date(), to_date(tbdlf fsimage accesstime)) <= 15; - 插入近30天(16-30天)数据:
INSERT INTO近30天访问SELECT * FROM 源表名 WHERE datediff(current_date(), to_date(tbdlf fsimage accesstime)) BETWEEN 16 AND 30; - 插入超过30天未访问数据:
INSERT INTO超过30天未访问SELECT * FROM 源表名 WHERE datediff(current_date(), to_date(tbdlf fsimage accesstime)) > 30;
验证逻辑
执行完后可运行以下语句校验数据总量是否匹配:
SELECT (SELECT COUNT(*) FROM `近15天访问`) + (SELECT COUNT(*) FROM `近30天访问`) + (SELECT COUNT(*) FROM `超过30天未访问`) AS 拆分总条数, (SELECT COUNT(*) FROM 源表名) AS 源表总条数;
两个数值一致则说明拆分无遗漏。
内容的提问来源于stack exchange,提问作者Eduardo
相关产品推荐
相关产品推荐

