hive分区表同步数据到doris分区分桶表详解

hive分区表同步数据到doris分区分桶表详解

本文从Broker Load来实现数据同步
一、 Broker
Broker是在doris中独立存在的,FE是负责元数据和任务调度,BE负责存储实际数据和执行任务,当BE执行数据同步任务时,会从Broker里拉取数据,直到所有BE拉取完毕,拉取数据才会完整,故而能通过Broker Load来实现数据同步
二、表结构
创建hive分区表 wm_app.app_usertouch_all_kpi_num_user_day
表结构如下
在这里插入图片描述
创建doris分区分桶表

CREATE TABLE `usertouch_all_kpi_detail_user_day_snap` (
  `mid` bigint(20) NOT NULL COMMENT "活动id",
  `active_id` int(11) NULL COMMENT "活动id",
  `plan_id` int(11) NULL COMMENT "活动id",
  `wait_send_time` date NULL COMMENT "触达时间",
  `par_date` date NOT NULL COMMENT "分区字段",
  `touch_flag` int(11) NULL COMMENT "触达标识",
  `succ_flag` int(11) NULL COMMENT "发送成功标识",
  `target_flag` int(11) NULL COMMENT "目标标识",
  `click_flag` int(11) NULL COMMENT "点击标识",
  `plan_flag` int(11) NULL COMMENT "计划报名标识",
  `xiao_flag` int(11) NULL COMMENT "小课转化标识",
  `xuda_flag` int(11) NULL COMMENT "大课续保标识",
  `gmv_flag` int(11) NULL COMMENT "大课续报gmv(plan_id粒度)"
) ENGINE=OLAP
DUPLICATE KEY(`mid`, `active_id`, `plan_id`, `wait_send_time`, `par_date`)
COMMENT "指标明细表"
PARTITION BY RANGE(`par_date`)()
DISTRIBUTED BY HASH(`mid`) BUCKETS 10
PROPERTIES (
"replication_num" = "3",
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.time_zone" = "Asia/Shanghai",
"dynamic_partition.start" = "-7",
"dynamic_partition.end" = "3",
"dynamic_partition.prefix" = "p",
"dynamic_partition.replication_num" = "3",
"dynamic_partition.buckets" = "10",
"in_memory" = "false",
"storage_format" = "V2"
);

使用动态分区建表的方式,详解如下
在这里插入图片描述

三 shell脚本
建好表后在hive表中插入数据方便后续测试,话不多说,直接上脚本

#!/bin/sh
time=`date +%H:%M:%S`
day=`date +%Y-%m-%d`
ndt=`date -d '-1 day' +%Y-%m-%d`
echo $time
echo $day
date_line=`date "+%Y-%m-%d %H:10:00"`
### 用户拼接hadoop中的数据路径
dt=`date -d '-1 day' +%Y%m%d`

sink_database=wm_persona
# Doris Table
sink_table=usertouch_all_kpi_detail_user_day_snap

# hive Table
hive_table=app_usertouch_all_kpi_detail_user_day
# 分区
hour=15
# 
hive_hdfs_file=hdfs://emr-cluster/user/hive/warehouse/wm_app.db/${hive_table}/par_date=${dt}/*

echo $hive_hdfs_file
### 每日执行生成唯一标签
label_date=${sink_table}_`date +%Y%m%d%H%M%S`

sql="use $sink_database;
LOAD LABEL ${sink_database}.${sink_table}
 (
  DATA INFILE('$hive_hdfs_file')
  INTO TABLE $sink_table
  FORMAT AS 'orc'
  ( 
  mid,
  active_id,
  plan_id,
  wait_send_time,
  touch_flag,
  succ_flag,
  target_flag,
  click_flag,
  plan_flag,
  xiao_flag,
  xuda_flag,
  gmv_flag
  )
  SET(
  mid=mid,
  active_id=active_id,
  plan_id=plan_id,
  wait_send_time=wait_send_time,
  touch_flag=touch_flag,
  succ_flag=succ_flag,
  target_flag=target_flag,
  click_flag=click_flag,
  plan_flag=plan_flag,
  xiao_flag=xiao_flag,
  xuda_flag=xuda_flag,
  gmv_flag=gmv_flag,
  par_date='"${ndt}"'
    )
  )
 WITH BROKER 'broker_name'
  (
  'username'='数据库用户名', 
  'password'='数据库密码',
  'dfs.nameservices'='emr-cluster',
  'dfs.ha.namenodes.emr-cluster'='nn1,nn2',
  'dfs.namenode.rpc-address.emr-cluster.nn1'='hdfs主节点:8020',
  'dfs.namenode.rpc-address.emr-cluster.nn2'='hdfs高可用节点:8020',
  'dfs.client.failover.proxy.provider'='org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider'
  )
  PROPERTIES
  (
  'timeout'='3600',
  'max_filter_ratio'='0.001'
  );
"
echo $sql
mysql -u用户名 -p'密码' -h 主机地址 -P 9030 -e "$sql"


echo '=============end============'

脚本详解如下(更正:经过测试,doris是支持Parquet存储格式的表的,但不如支持orc更加的完善)
在这里插入图片描述

通过命令查看broker名字 ,命令 SHOW PROC "/brokers" 
不同doris可能设置不一致

在这里插入图片描述
同步过程中可能会发生一些其他问题,但是shell日志不会显示明细,这个困扰我好久,后来发现可以在doris里查看同步数据任务,而且错误指向也很明确

在doris目标数据库中,使用show load 查看导入明细

如果是Finish,说明导入成功,不是就是导入失败,根据提示就可以看到原因

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hive中的分区表是用来提高查询性能和管理数据的两种技术。 分区表是将数据按照某个列的值进行区存储的。通过将数据散存储在不同的区中,可以减少查询时需要扫描的数据量,提高查询效率。创建分区表的语法是使用ALTER TABLE语句,并指定区的列和值。删除区可以使用ALTER TABLE语句的DROP PARTITION子句。可以使用DESC FORMATTED命令查看分区表的结构,使用SELECT语句查询分区表数据。\[1\] 是将数据按照哈希函数的结果进行存储的可以提高数据的读取和查询效率,特别是在进行连接操作时。创建的语法是使用CLUSTERED BY子句指定的列,并使用INTO子句指定的数量。可以使用INSERT INTO TABLE语句将数据导入。\[2\] 在Hive 0.x和1.x版本中,需要设置hive.enforce.bucketing=true来强制,以便程序可以根据结构自动选择正确数量的Reducer和cluster by column来进行。可以使用CTAS语句将数据从一个复制到中。\[3\] 总结起来,分区表都是用来提高查询性能和管理数据的技术,分区表是按照某个列的值进行区存储,而是按照哈希函数的结果进行存储。 #### 引用[.reference_title] - *1* *2* [大数据Hive(七)_ 分区表](https://blog.csdn.net/m0_52968216/article/details/128667517)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Hive分区表](https://blog.csdn.net/mxk4869/article/details/125635202)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值