如何使用hive3的acid表实现kimball建模的代理键
1.使用byzer导入2亿条数据

2.byzer将数据写入到hive3

3.在hive中check数据


走到这里条数也对上了
4.我们创建一张customer_test表,使用scd的方式,然后对这张2亿条数据的表进行重刷,查看时间
1 | set hive.support.concurrency=true; |
5.合并时间98s

技术爱好者




走到这里条数也对上了
1 | set hive.support.concurrency=true; |

#阅读 css100 天
1 | div { |
1 | <h3>left to right</h3> |
1 | button { |
1 | div { |
1 | div { |
1 | <form> |
1 | .form-item { |
? 显示帮助h/j/k/l 上下左右滚动网页,滚动范围较小d/u 上下滚动半屏, 如果只用左手,也可以e/dU/P 上下滚动一屏gg 跳转到最上面,G 跳转到最下面0 跳转到最左边, $ 跳转到最右边csf 当前页打开链接af 新标签页打开链接,并且跳转gf 新标签页打开链接,不跳转E/R,B/Fg0/g$yyxXWrctrl + 6<</>>yt 创建新的标签页,不跳转yT 创建新的标签页,并且跳转onTS/Dgi: 跳到第一个输入框i: 进入文本框选择模式;当有多个时,会类似 f,输入对应的字母聚焦该文本框I: 选择文本框,并打开 VIM 编辑器zv: 进入可视模式,并全选指定文本v: 进入可视模式,通过屏幕中的字母选择位置后,需要再按一次 v 才能选择y: 复制选择的文字esc``esc: 两次esc退出可视模式v: 退出可视模式go: 在当前页打开t: 在新页签打开b: 搜索收藏夹的内容并在新标签页打开;u/;U: 编辑当前浏览器中的地址/: 查找n: 查找下一个N: 查找上一个
/ + 搜索字符后,enter是模糊搜索,ctrl + enter是精准搜索。比如/code,enter后vscode也可以被搜索到,而ctrl + enter就不会搜到。
进入可视模式后,使用
*可以搜索光标所在的单词,也可以使用f/F搜索,与vim原生一样,f + 单字符搜索,;/,重复搜索上/下一个
m + any character: 标记当前位置' + any character: 跳转回来cfhjkl 上下左右d/u 上下滚动半屏gg 最上边,G 最下边zH 最左边,zL 最右边J/K 切换左右标签页^ 两个标签页来回跳转T 在所有标签页中搜索g0 跳到第一个标签页g$ 跳到最后一个标签页t 新建标签页W 移动当前标签到下一个窗口number <</>> 往左往右移动标签页H/L 前进后退可以理解为go input的简写
gi进入文本选择框,就是input窗口,按tab键切换yv 进入可视模式,并全选指定文本, V 复制整行, y复制选择的文字, 两次esc第一次取消选择,第二次退出可视模式yy 复制当前标签页的网址x 关闭当前标签页,X恢复最近关闭的标签页(推荐cmd + w)r 刷新当前标签页yt 复制当前的标签页f 后,红色的文字是切换滚动区域,黑色的文字是链接跳转f 当前页打开,F 新建标签页打开(后台)o 在当前页打开, O 新建标签页打开(后台)o + g + space: 使用 google 搜索o + b + space: 使用 baidu 搜索o + bi + space: 使用 bing 搜索o + gh + space: 使用 github 搜索b 显示搜索框并搜索收藏夹的内容,B 新建标签页打开(后台)ge/gE 当网址是一个搜索引擎时,是编辑搜索关键字,否则编辑当前网址/ 查找n 查找下一个N 查找上一个m 标记当前位置gugUcmd + opt + i 打开/关闭开发者工具cmd + opt + c 打开/关闭element控制台cmd + opt + j 打开/关闭console控制台cmd + [/] 切换控制台cmd + k 清空console控制台cmd + p 搜索文件cmd + shift + p 搜索命令由于网上的关于数据质量平台的方案比较少,目前datavines看上去很不错,但是目前这个项目还在起步阶段,有兴趣的话,可以一起参与这个项目共建。
所以笔者暂时先用great_expectations来尝试做质量校验。
1 | // 为了方便控制环境,我这边使用conda 创建python38的环境 |
为了方便,我这边直接使用docker创建一个mysql

1 | # 这里是一个注意点,目前2.0的sqlalchemy还是有些bug的,目前还不能完美支持,请使用1.4.0的版本 |
1 | great_expectations init |

1 | great_expectations datasource new |


连接会自动跳转到一个jupyter notebook

这里需要特别注意一下,不然会报错(object supporting the buffer API required):

我们依次完成对应的配置。最后的结果图:

我们打开文件夹删除掉添加用到notebook

1 | great_expectations suite new |

1 | 这里有一个issue,目前我已经提上去了,还在和官方交流中 |
https://github.com/great-expectations/great_expectations/issues/7030

1 | brew install --cask keycastr |
1 | let context_aware=0 |
注意: blank字符有空格、换行、tab、回车等等
D === d$
C === d$i
S === ddi
{和}回到上一个或者下一个空行
% 切换对应的括号结束和开始
#和*快速切换指针所在的同名单词
d3k和d3j向上和向下删除3行
当我们使用G按钮的时候(这里包括了{number}g),vim会记录下原来的跳转位置, ctrl+ i: 前进, ctrl + o: 后退
m{a-z}: 标记光标所在的位置,局部标记,只用于当前文件m{A-Z}: 标记光标所在位置,全局标记,标记之后,退出vim,重新启动,标记仍然有效'{a-z}: 移动到标记为止的行首'': 来回切换这次和上次光标所在的位置,不过光标在行首'.: 移动到上次更改的光标位置的行首。:marks: 查看所有标记.:delmarks a b – 删除标记a和b。:delmarks a-c – 删除标记a、b和c。:delmarks a c-f – 删除标记a、c、d、e、f。:delmarks! – 删除当前缓冲区的所有标记。:wq 退出:e! 不保存,强制重新加载:q! 强制退出
h,j,k,l分别用来上下左右移动
注意:如果是一行换行,j,k可能无法移动,使用gj,gk
H,M,L指针跳转到屏幕上方(Head),中间(Middle)和底部(Lower)zt将当前行置于屏幕的最上方zz将当前行置于屏幕的中间zb将当前行置于屏幕的最下方
ctrl + g显示当前位置ctrl + u/d 向上下滚动半屏ctrl + y/e 向上下滚动一行ctrl + b/f 向上下滚动一屏
gg返回文章到开头number + G/gg可以到达指定到行数
i在指定单词前面插入,I在指定当行最前面插入a在指定单词后面插入,A在指定当行最后面插入o在指定行下方插入,O在指定行上方插入s删除光标所在字符,并进入插入模式cc删除整行,并进入插入模式(此处等于S)。
C删除光标往后的字符并把输入符号向前移动一个字符,ck,cl,ch,cj,cb,ce,c$等
ctrl+[退出 insert mode
单词: 字母组成到单词、括号等字串: 空格、tab、换行分割的字符
^将光标移动到行首第一个非blank字符到位置g_将光标移动到行末第一个非blank字符的位置0将光标移动到行首,包括blank字符$将光标移动到行末,包括blank字符
+ 移动下一行的第一个字符- 移动到上一行的第一个字符
e移动到单词的结尾(从左往右移动)w移动到单词的开头(从左往右移动)b移动到单词的开头(从右往左移动)ge移动到上个单词的结尾(从右往左移动)
E移动到字串的结尾(从左往右移动)W移动到字串的开头(从左往右移动)B移动到字串的开头(从右往左移动)gE移动到字串的结尾(从右往左移动)
常用组合按键: v,c,d可以与方向移动键做出组合,下面是常用示例cw删除当前单词并进入insert模式,会保留下个单词前的空格dw删除当前单词,不会保留下个单词前的空格ea在当前单词的结尾处添加d^删除到行首,光标所在单词不会删除
~字母转换大小写J删除换行符,可以使下一行合并上来,nJ连接后面的 n 行.记住上一次修改的动作,并重复
>添加缩进. >>缩进一个tab,>G到末尾的所有行缩进
/向后查找(模糊搜索)?向前查找(模糊搜索)v/c/d可以结合/,?进行选中和删除范围
*移动到下一个光标所在单词,可以使用n或者N记住上一步到操作,然后继续#移动到上一个光标所在单词,可以使用n或者N记住上一步到操作,然后继续
f{motion}移动到 motion 到单词上,从左往右。F{motion}移动到 motion 到单词上,从右往左。同时可以搭配;和,可以快速重复上一个动作t{motion}移动到 motion 到单词之前,从左往右。T{motion}移动到 motion 到单词之后,从右往左。同时可以搭配;和,
可以快速重复上一个动作v/c/d可以结合f选中/删除到范围都是从当前位置到搜索到的位置
yy复制当前行,同时还可以推理出yw复制到下一个单词为止,yk,yl,yh,yj,yb,ye,y$等
dd删除当前行,同时还可以推理出dw删除到下一个单词为止,dk,dl,dh,dj,db,de,d$等
D删除光标之后的单词
x删除光标所在的字符,X删除光标前的字符
p在指针后面粘贴,P在指针前面粘贴
r替换光标所在的字符,R逐个替换字符,可以依次修改整个语句
u撤销,U撤销当前行的所有操作ctrl + r redo 重做,恢复
v 基于字符的可视化选择V 基于行的可视化选择o 在 v 可视化状态下,可以切换可视区域光标的起始/终止位置O 光标移动到选中文本的另一个角落ctrl + v 基于块的可视化选择,用于处理多行文本gv 回到上一次选中到选择区域gb 快速选中当前单词,再次按gb继续往下选择相同的单词,然后可以统一修改
在选中模式下,使用normal A.png就会默认在选中行添加A.png
c删除选中内容,同时进入 insert 模式A和I多行编辑的时候可以使用d删除选中的文本D删除选中部分的文本,和d不同之处在于,既是选中文本中有些字符所在到行没有被选中,删除时也会一并删除y将选中部分复制到剪贴板p将剪贴板内容粘贴到光标之后,P将剪贴板内容粘贴到光标之前u将选中内容全部改成小写,U将选中内容全部改成大写>将选中内容右移一个 tab 键规定的长度<将选中内容左移一个 tab 键规定的长度
ctrl + q 进入多选择模式,可以有多指针
假设光标在你想要移动的那一行上。
上下移动:m移动
:m +1 – 向下移动1行
:m -2 – 向上移动1行
(请注意,您可以用任何数字replace+1,具体取决于您想要向上或向下移动的行数,即+2会将其向下移动2行,-3会将其向上移动2行)
移动到特定的行
:set number – 显示号码行(更容易看到你移动到哪里)
:m 3 – 在第三行之后移动行(将3replace为您想要的行)
移动多行:
V (即Shift – V )并上下移动select器以在VIM中select多行
一旦选中:并运行上面的命令, m +1等
[number] d,c,y,text object 是要操作的文本对象,比如单词
w,句子 s,段落 p
i: 内部a: 外部
w: 一个单词, 内部: 单词本身, 外部: 单词本身 + 左右空格, 优先空格W: 一个字串, 内部: 字串本身, 外部: 单词本身 + 左右空格, 优先空格(,),b: 一对[],内部: 括号内部, 外部: 括号以及括号内部[,]: 一对[],内部: 括号内部, 外部: 括号以及括号内部{,},B: 一对{},内部: 括号内部, 外部: 括号以及括号内部<,>: 一对<>,内部: 括号内部, 外部: 括号以及括号内部t: html 文本': 一对单引号,内部: 括号内部, 外部: 括号以及括号内部": 一对双引号,内部: 括号内部, 外部: 括号以及括号内部
反引号: 一对反引号,内部: 括号内部, 外部: 括号以及括号内部s: 一个句子,以.!?结尾p: 一个段落,以空行分隔,内部选中该段落,外部还会选中下面的空行
:reg 查看所有寄存器:[a-z] 重置寄存器到值:[A-Z] 添加值到寄存器
:ls 查看所有打开文件:b + n 可以跳转到对应文件:b + pre 跳转到前一个文件:b + next 跳转到后一个文件:b + first 跳转到第一个文件:b + last 跳转到最后一个文件:b + buffer_name 加上 tab 补全跳转
ctrl + w 窗口循环切换
必须先按下ctrl + w:w window,切换到下一个窗口r reverse,互换窗口c close,关闭当前窗口,不能关闭最后一个窗口q quit 退出当前窗口,如果是最后一个窗口,则关闭 vimo other 关闭其他窗口:sp 横向分屏:vsp 纵向分屏
公式:: [range]s[ubstitute]/{pattern}/{string}/[flags]
公式中[]内是可选的,{}内是必填的
range 表示范围
%:表示替换全文;number1,number2:表示替换number1行到number2行;$表示替换到文件尾部,可以和number配合,比如number,$或$,number;s[ubstitute]: 表示替换命令,可以简写为s,全称为substitute
pattern: 表示被替换的字符,可以输入正则表达式
string: 表示替换的字符
flags: 取值有两个:
g表示全局替换,如果不加g,默认只替换每行第一个匹配到的字符。c会弹出对话框,询问是否替换,输入y表示替换当前字符,n表示不替换当前字符,a表示替换所有,q表示退出,lflag一起使用,比如gcn统计数量输入命令按回车后即执行替换命令,如果切换到 normal 模式,不执行替换命令,类似预览,可以先预览看看是不是我们要替换的结果,如果是就按回车,否则按
Esc
小知识:当使用可视化模式选择多行又退出可视化后(选择执行完其他命令后 Esc),’< 会跳转到刚才可视化选择的起始位置,’>
会跳转到刚才可视化选择的结束位置
:s/old/new - 用 new 替换当前行第一个 old。
:s/old/new/g - 用 new 替换当前行所有的 old。
:n1,n2s/old/new/g - 用 new 替换文件 n1 行到 n2 行所有的 old。
:%s/old/new/g - 用 new 替换文件中所有的 old。
:%s/^/xxx/g - 在每一行的行首插入 xxx,^表示行首。
:%s/$/xxx/g - 在每一行的行尾插入xxx,$表示行尾。
有替换命令末尾加上 c,每个替换都将需要用户确认。 如:%s/old/new/gc,加上 i 则忽略大小写(ignore)。
q 录制和结束录制宏q[a-z]选择要保存的寄存器,把录制的命令保存到其中@[a-z]回放寄存器到一系列命令
ctrl + v 选中所有, :normal @a所有行执行宏
yiw复制指定单词
viwp粘贴指定单词
熟练应用.,他会记住上一次的动作
a + $ +esc使用一次之后,可用.代替,不要自我重复
减少无关的移动,多使用复合命令
| 复合命令 | 等效长命令 |
|---|---|
| C | c$ |
| s | Cl |
| S | ^C |
| I | ^i |
| A | $a |
| o | A |
| O | ko |
f和t可以通过;和,进行重复和回退
gv 回到上一次选中到选择区域
可视化模式下U可以把选中内容大写
MaterialApp是一个方便的Widget,它封装了应用程序实现Material Design所需要的一些Widget。一
般作为顶层widget使用。
常用的属性:
Scaffffold是Material Design布局结构的基本实现。此类提供了用于显示drawer、snackbar和底部sheet
的API。
Scaffffold 有下面几个主要属性:
一直以来跨平台的中文字体 CSS 设置都是一件让人很头疼的事情,这个库打包了一些常见字体的名字,希望能覆盖 Windows、Mac 以及 Linux 的常见字体,方便引用。在 font-family 直接支持宋、楷、黑和仿宋之前,我觉得这样一种解决方案依然还是有其存在价值的。
项目地址: https://github.com/zenozeng/fonts.css
1 | npm install fonts.css --save |
或者直接复制他的配置
记录一次jupyterhub不能正确激活conda预设env的问题
1 | conda install nb_conda_kernels |
1 | pip install --user ipykernel |
1 | python -m ipykernel install --user --name pyalink --display-name "pyalink" |
1 | jupyter kernelspec list |
大功告成!!!

我们由UpsertKafkaDynamicTableFactory来观察这个connector的实现
首先我们查看UpsertKafkaDynamicTableFactory的uml类图关系
从上面我们可以看到DynamicTable一般都需要实现具体的DynamicTableSourceFactory和DynamicTableSinkFactory
笔者这次主要写的是upsert_sert所以我们这次主要看DynamicTableSinkFactory的源码。
1 | @Override |
1 | private static void validateSink( |
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent:
meta: false
pages: false
posts:
title: true
date: true
path: true
text: false
raw: false
content: false
slug: false
updated: false
comments: false
link: false
permalink: false
excerpt: false
categories: false
tags: true