数仓回刷历史数据--hive设置动态分区,并向动态分区内刷入历史数据
数仓回刷历史数据–hive设置动态分区,并向动态分区内刷入历史数据
内容目录
- 数仓回刷历史数据--hive设置动态分区,并向动态分区内刷入历史数据
- 一、问题介绍
- 二、问题解决思路
- 1 . 解决复杂逻辑任务
- 2. 数据一致性
- 3. 数据分区问题
- 三、必备知识
- 1. checksum验证一致性
- 2. hive动态分区
- 四、实际操作
一、问题介绍
今天发现一张表在今年开始有一个字段就没有数据了,没有办法只能是去重新写下逻辑重新刷一下数据。
首先介绍一下这个表,是一张全量表,每天数据在3G左右,有多个上游任务,同时也有多个下游任务。所以对于刷数据的时候就哟啊考虑一下
刷数据有几个问题会出现:
- 原始逻辑很复杂,肯定不能通过直接重跑数据做到数据回刷
- 刷数据怎么保证数据的一致性
- 确实的数据有100天,如何把这些数据放到相应的分区,总不能运行100次吧
二、问题解决思路
1 . 解决复杂逻辑任务
对于问题1,逻辑很复杂,上下游任务较多的时候,可以直接冲刷数据没有问题,但是不建议这样做,这里采取的办法是把确实的字段和表粒度信息放到一张临时表里,把数据全刷回临时表之后,再次把临时表数据刷到目标表即可
2. 数据一致性
对于冲刷历史数据,最重要的肯定是数据怎么保证和已经入仓的数据保持一致性,如果辛辛苦苦刷了100天的数据,发现和仓里的数据完全对不上,那就面向白干式刷数据。
这里提供两种方案:
①比较简单的
看刷完数据和仓内数据某一天的数据行数,如果数据行数是一致的,那么可以80%的可能是没有问题的,但是也不排除20%的可能是有问题的。比如行数一致但是内容不一致。关于这个80%怎么来的,当然是我自己说的,没有科学依据
②比较科学的
检查两张表的数据除了刷的字段之外的checksum是否相同。这类似于一种算法处理机制,可以类比一下码代码时候的equal方法,借助hash值把数据都搞在一起,看看是不是一致的,这种方法是比较科学的,因为java之父就是这样干的,如果非要鸡蛋里挑骨头,你可以说存在哈希碰撞的情况,可能会造成极其幸运情况下下的误差,那就说准确度99.9%吧
③100%正确的
可以选择人工的把两张表数据拿出来,一个一个的去比较,当然也有你打盹眯眼的时候会出错
3. 数据分区问题
对于100天的数据,就会去到100个分区里,对于一个调度项目,中规中矩的可以执行到一个分区,所以执行到100个分区内时,就要运行100次,如果一天数据刷10min,100次就是1000min,也就一天一夜加班加点就刷完了,你花了一天就刷了100天的数据,看似你亏了,实际上你赚了。你可以这样尝试一下
当然了,可以选择一个hive黑科技,动态分区,就能解放劳动力,指定一个分区字段,剩下的交给hive完成
三、必备知识
理清了逻辑和分析了问题找到了解决方法,可能还需要一些必备知识
1. checksum验证一致性
关于这个一致性验证,可以调用一个hash方法
这个方法会返回传进去参数的hash值
那么就可以直接
select sum(hash(column)) from tbl;
2. hive动态分区
hive的动态分区在使用前需要先配置一下才行
①开启动态分区参数
默认就是true
hive.exec.dynamic.parition=true
②设置非严格模式
注意,必须设置非严格模式,否则不行
hive.exec.dynamic.parition.mode=nonstrict
③所有节点最大动态分区个数
hive.exec.max.dynamic.paritions=1000
④每个节点最大动态分区个数
hive.exec.max.dynamic.partitions.pernode=100
⑤整个mr job种可以创建多少HDFS文件
hive.exec.max.created.files=100000
以上这些不走就时配置好了动态分区
四、实际操作
这里做一个测试,并不是真实的数据
首先创建一张分区表
create table dyntable(name string, job int) partitioned by (logdate int);
看一下我们的表信息
desc extended dyntable;
我们拿两张表的数据简单连接一下往动态分区内刷数据
insert into table dyntable partition (logdate) select j1.name,j1.job,j2.logdate from jn1 j1 left join jn2 j2 on j1.name=j2.name and j1.logdate=j2.logdate;
这里有一个注意点,分区数据要在select字段的最后一个,因为会把前面的字段放进表字段内
查看刷进去的数据
select * from dyntable;
数仓回刷历史数据--hive设置动态分区,并向动态分区内刷入历史数据相关推荐
- 【学习笔记】第三章——内存 I(交换技术、进程七状态模型、动态分区分配、动态分区算法)
文章目录 一. 交换状态.进程七状态模型 二. 内存的分配方式 三. 动态分配算法 一. 交换状态.进程七状态模型 交换技术:内存空间紧张,把某些进程暂时换出外存.(进程在内存与磁盘间动态调度) 进程 ...
- android recovery分区内刷镜像,Android手机Recovery模式取证方法研究.pdf
Android手机Recovery模式取证方法研究 2015 年第 9 期 信息通信 2015 (总第 153 期) INFORMATION & COMMUNICATIONS (Sum. No ...
- hive当前日期超前_微博数仓数据延时优化方案
前言 本文以离线数据仓库为背景,重点介绍因传输链路数据延时的不确定性,可能导致部分延迟文件无法参与正常的调度计算或同步,导致数据缺失的问题成因.业务影响及相应的解决方案.关于这类问题的处理,有这么一种 ...
- 数仓系列第11篇:实时数仓
目录 导读: 1.数据仓库简介 2.数据仓库的发展 3.数据仓库建设方法论 4.数据仓库架构的演变 5.实时数仓案例 6. 实时数仓与离线数仓的对比 导读: 本文将从数据仓库的简介.经历了怎样的发展. ...
- 数仓(三)简析阿里、美团、网易、恒丰银行、马蜂窝5家数仓分层架构
上一篇我们介绍了数据集市的概念以及它和数仓的区别,并且重点论述了大数据数仓中的分层架构体系. 这篇我们简要分析一下以下5家公司的数仓分层架构模型: 1.马蜂窝数仓分层架构 2.阿里云MaxComput ...
- hive动态分区shell_Hive动态分区 参数配置及语法
Hive本身是不支持动态分区的.. 但动态分区是真的方便啊..不然手动维护要累死..按日期甚至小时来分区时动辄就好几千上万的分区..手动到哪一年去..? 想要用动态分区要先做一些设置来修改默认的配置. ...
- Hive 05_hive变量、动态分区
hive 参数.变量 --hive当中的参数.变量,都是以命名空间开头 --通过${}方式进行引用,其中system.env下的变量必须以前缀开头 hive 参数设置方式 --1.修改 ...
- Hive动态分区 参数配置及语法
Hive本身是不支持动态分区的.. 但动态分区是真的方便啊..不然手动维护要累死..按日期甚至小时来分区时动辄就好几千上万的分区..手动到哪一年去..? 想要用动态分区要先做一些设置来修改默认的配置. ...
- 深圳大数据培训:大数据开发之掌握Hive的静态分区与动态分区
深圳大数据培训:大数据开发之掌握Hive的静态分区与动态分区 分区是hive存放数据的一种方式.将列值作为目录来存放数据,就是一个分区. 这样查询时使用分区列进行过滤,只需根据列值直接扫描对应目录下的 ...
最新文章
- MFC底层窗口的实现
- TinyBERT搜索: 比BERT快10倍,小20倍
- Android中asset文件夹和raw文件夹区别
- 字符串的构造方法和直接创建
- fatal: remote origin already exists.解决方法
- java数组使用实验报告_JAVA数组与类的定义-java实验报告
- java单个变量的表达式_java中使用Lambda表达式的5种语法
- 饿了么监控系统 EMonitor 与美团点评 CAT 的对比
- VMware (CentOS 6.x)克隆导致的网卡问题
- 谈谈android不同尺寸,不同分辨率的布局
- C语言关键字浅析-case
- 如何使用Ubuntu安装QQ音乐Linux版本
- 对计算机专业学科的认识1000字,计算机专业1000字实习报告
- 路由器选华硕还是tp_家用选TP-LINK路由器好还是华为路由器好
- 视觉三维重建:colmap从理论到实战
- 一文入门智能开关的3种功能形态
- Java中hash算法细述
- 计算机锁屏图片怎么设置方法,怎么设置电脑锁屏图片 电脑锁屏图片设置步骤...
- 数学建模之对策论/竞赛论/博弈论(Python)
- Linux网络服务——FTP服务器搭建