二百二十四、Kettle——曲线实现从Hive插入更新到ClickHouse(分区字段是month或year)

一、目的

对于以month、year为分区字段的数据,不是像day字段分区那样每天增量插入更新即可,而是要以部分字段查询、部分字段更新,但是ClickHouse数据库并不适合更新操作,直接使用Kettle的插入更新控件会导致问题,必须曲线实现这个功能

二、Hive的DWS层建表语句和ClickHouse的ADS建表语句

(一) Hive的DWS层建表语句

复制代码
create  table  if not exists  dws_avg_volume_day_month(
    scene_name             string      comment '场景名称',
    device_direction       string      comment '雷达朝向',
    sum_volume_month       int         comment '每月总流量',
    count_day              int         comment '每月总天数',
    avg_volume_day_month   int         comment '月均维度的日平均流量'
)
comment '月均维度的日平均流量表'
partitioned by (month string)
stored as orc
;

(二)ClickHouse的ADS建表语句

复制代码
create  table  if not exists  hurys_dc_ads.ads_avg_volume_day_month(
    scene_name             String      comment '场景名称',
    device_direction       String      comment '雷达朝向',
    sum_volume_month       int         comment '每月总流量',
    count_day              int         comment '每月总天数',
    avg_volume_day_month   int         comment '月均维度的日平均流量',
    month                  String      comment '月份'
)ENGINE = MergeTree
PARTITION BY (month)
PRIMARY KEY month
order by month
SETTINGS index_granularity = 8192;

对于这类表,每天执行任务时scene_name、device_direction、month等String字段基本并不需要变,只有sum_volume_month、count_day、avg_volume_day_month等Int字段需要每日更新

三、对于插入更新这种需求,一般使用Kettle的增量插入更新

(一)似MySQL关系型数据库

如果似MySQL这种关系型数据库,适合增删改查等事务性操作,那么可以直接用Kettle的插入更新控件

1、Kettle的插入更新任务步骤(样例直接全量插入更新)

(1)关键是插入更新控件配置

2、在MySQL中直接修改表中数据

3、再次运行Kettle任务

4、在MySQL目标表中验证数据

数据量并没增加,只是发生更新

(二)类ClickHouse列式存储数据库

但是,对于ClickHouse这种列式存储数据库,不适合删除、修改等事务性操作,则没法直接使用Kettle的插入更新控件

1、Kettle的插入更新任务步骤

(1)关键是插入更新控件配置

用来查询的关键字是不需要基本不需要变更的字段,一般是主键,如果没有主键则几个字段组合成主键

更新字段是所有字段,不能把更新N,否则相关字段只能插入不能更新

2、用Kettle插入更新控件实现增量插入更新后,如果数据没有更改则运行没有问题

3、但是如果更改部分字段的数据,则会报错

(1)先在Hive中增加一天数据以增加DWS层表中数据
(2)再次运行Kettle任务,则会报错

所以,对于相同的插入更新控件配置,导入MySQL插入更新可以,导入ClickHouse插入更新则失败!

四、对于从Hive到ClickHouse,要实现插入更新的功能,只能先删除ClickHouse表数据再导入数据

(一)删除ClickHouse数据方式

删除ClickHouse数据虽然有几种方法,可以delete,也可以删除分区,也可以truncate,也可以TTL设置保存时间,还可以删除数据文件,但是对这种需要即时删除ClickHouse表中最新的分区数据,无法用delete、TTL等方式实现,而删除分区又太麻烦,刚好这几张表的数据量较少,因此先采用truncate方式,先删除表数据,再全量导入即可

(二)truncate方式实现方法

1、SQL运行

2、在表输出控件中勾选✔剪裁表

这两种方式都试过,都可以!

但是为了避免勾选✔剪裁表后面可能导致问题,还是实现SQL实现稳妥些

五、Kettle任务步骤

(一)执行SQL脚本

(二)hive输入

(三)字段选择

(四)clickhouse输出

(五)保存后运行kettle任务

(六)查看ClickHouse中表数据

六、验证是否实现插入更新功能

(一)删除Hive中1天的数据

(二)运行Kettle任务

(三)查看ClickHouse中表数据

数据量不变,只是2月份的数据发生改变,算是实现了ClickHouse插入更新的功能!

后面如果有更好的方法就再完善,目前能用就行

相关推荐
小四的快乐生活2 天前
Hive 存储管理测试用例设计指南
hive·hadoop·测试用例
阿里云大数据AI技术2 天前
鹰角网络基于阿里云 EMR Serverless StarRocks 的实时分析工程实践
starrocks·clickhouse·阿里云·emr·实时分析
PawSQL3 天前
十年磨一剑!Apache Hive 性能优化演进全史(2013 - )
大数据·hive·性能优化
越来越无动于衷3 天前
Spring Boot 整合 Spring MVC:自动配置与扩展实践
数据仓库·hive·hadoop
君不见,青丝成雪5 天前
Hadoop技术栈(四)HIVE常用函数汇总
大数据·数据库·数据仓库·hive·sql
更深兼春远5 天前
flink+clinkhouse安装部署
大数据·clickhouse·flink
yatingliu20195 天前
HiveQL | 个人学习笔记
hive·笔记·sql·学习
步行cgn7 天前
在 HTML 表单中,name 和 value 属性在 GET 和 POST 请求中的对应关系如下:
前端·hive·html
喂完待续7 天前
【Tech Arch】Hive技术解析:大数据仓库的SQL桥梁
大数据·数据仓库·hive·hadoop·sql·apache
Sais_Z8 天前
ClickHouse的学习与了解
数据库·clickhouse