|
1 | 1 | ## 1.格式:
|
2 |
| -``` |
3 |
| -CREATE TABLE tableName( |
| 2 | + |
| 3 | +```sql |
| 4 | +CREATE TABLE flinkTableName( |
4 | 5 | colName colType,
|
5 | 6 | ...
|
6 |
| - colNameX colType |
| 7 | + colNameX colType, |
| 8 | + PRIMARY KEY (colName, ..., colNameX) |
7 | 9 | )WITH(
|
8 | 10 | type ='redis',
|
9 | 11 | url = 'ip:port',
|
10 | 12 | database ='dbName',
|
11 | 13 | password ='pwd',
|
12 |
| - redisType='1', |
| 14 | + redisType='1/2/3', |
13 | 15 | tableName ='tableName',
|
14 |
| - parallelism ='parllNum' |
| 16 | + parallelism ='parallelismNum' |
15 | 17 | );
|
16 | 18 | ```
|
17 | 19 |
|
18 | 20 | ## 2.支持版本
|
19 |
| -redis5.0 |
| 21 | + |
| 22 | +redis5.x, redis6.x |
20 | 23 |
|
21 | 24 | ## 3.表结构定义
|
22 |
| - |
| 25 | + |
| 26 | +在redis结果表中,实际的数据使用hash的格式存储,其中,key的组合为tableName_primaryKeys。详细请看《7.Redis数据说明》 |
| 27 | + |
23 | 28 | |参数名称|含义|
|
24 | 29 | |----|---|
|
25 |
| -| tableName | 在 sql 中使用的名称;即注册到flink-table-env上的名称 |
26 |
| -| colName | 列名称,redis中存储为 表名:主键名:主键值:列名]| |
27 |
| -| colType | 列类型,当前只支持varchar| |
| 30 | +| flinkTableName | 在 sql 中使用的名称;即注册到flink-table-env上的名称 |
| 31 | +| colName | 列名称| |
| 32 | +| colType | 列类型| |
28 | 33 |
|
29 | 34 | ## 4.参数:
|
30 |
| - |
| 35 | + |
31 | 36 | |参数名称|含义|是否必填|默认值|
|
32 | 37 | |----|---|---|-----|
|
33 | 38 | | type | 表名 输出表类型[mysq|hbase|elasticsearch|redis]|是||
|
34 | 39 | | url | redis 的地址;格式ip:port[,ip:port]|是||
|
35 | 40 | | password | redis 的密码 |是||
|
36 | 41 | | redisType | redis模式(1 单机,2 哨兵, 3 集群)| 是 |
|
37 | 42 | | masterName | 主节点名称(哨兵模式下为必填项) | 否 |
|
38 |
| -| database | reids 的数据库地址|否|| |
| 43 | +| database | redis 的数据库地址|否|| |
39 | 44 | | tableName | redis 的表名称|是||
|
40 | 45 | | parallelism | 并行度设置|否|1|
|
41 |
| -|timeout| 连接超时时间|否|10000| |
42 |
| -|maxTotal|最大连接数|否|8| |
43 |
| -|maxIdle|最大空闲连接数|否|8| |
44 |
| -|minIdle|最小空闲连接数|否||0| |
45 |
| -|masterName| 哨兵模式下的masterName|否|| |
46 |
| -|primarykeys|主键字段,多个字段以逗号分割|是|| |
47 |
| -|keyExpiredTime|redis sink的key的过期时间。默认是0(永不过期),单位是s。|否|| |
48 |
| - |
49 |
| - |
| 46 | +| timeout | 连接超时时间|否|10000| |
| 47 | +| maxTotal |最大连接数|否|8| |
| 48 | +| maxIdle |最大空闲连接数|否|8| |
| 49 | +| minIdle |最小空闲连接数|否||0| |
| 50 | +| masterName | 哨兵模式下的masterName|否|| |
| 51 | +| keyExpiredTime |redis sink的key的过期时间。默认是0(永不过期),单位是s。|否|| |
| 52 | + |
50 | 53 | ## 5.样例:
|
51 |
| -``` |
52 |
| - CREATE TABLE MyTable( |
53 |
| - name varchar, |
54 |
| - channel varchar |
55 |
| - )WITH( |
56 |
| - type ='kafka10', |
57 |
| - bootstrapServers ='172.16.8.107:9092', |
58 |
| - zookeeperQuorum ='172.16.8.107:2181/kafka', |
59 |
| - offsetReset ='latest', |
60 |
| - topic ='mqTest01', |
61 |
| - timezone='Asia/Shanghai', |
62 |
| - updateMode ='append', |
63 |
| - enableKeyPartitions ='false', |
64 |
| - topicIsPattern ='false', |
65 |
| - parallelism ='1' |
66 |
| - ); |
67 |
| - |
68 |
| - CREATE TABLE MyResult( |
| 54 | + |
| 55 | +```sql |
| 56 | + CREATE TABLE MyResult |
| 57 | + ( |
69 | 58 | channel VARCHAR,
|
70 |
| - pv VARCHAR |
71 |
| - )WITH( |
72 |
| - type ='redis', |
73 |
| - primarykeys='name', |
74 |
| - redisType ='1', |
75 |
| - url ='172.16.8.109:6379', |
76 |
| - tableName ='resultTable', |
77 |
| - partitionedJoin ='false', |
78 |
| - parallelism ='1', |
79 |
| - database ='0', |
80 |
| - timeout ='10000', |
81 |
| - maxTotal ='60000', |
82 |
| - maxIdle='8', |
83 |
| - minIdle='0' |
84 |
| - ); |
85 |
| - |
86 |
| - insert |
87 |
| - into |
88 |
| - MyResult |
89 |
| - select |
90 |
| - channel, |
91 |
| - name as pv |
92 |
| - from |
93 |
| - MyTable a |
94 |
| - ``` |
| 59 | + pv VARCHAR, |
| 60 | + PRIMARY KEY (pv) |
| 61 | + ) WITH ( |
| 62 | + type = 'redis', |
| 63 | + redisType = '1', |
| 64 | + url = '172.16.8.109:6379', |
| 65 | + tableName = 'resultTable', |
| 66 | + partitionedJoin = 'false', |
| 67 | + parallelism = '1', |
| 68 | + database = '0', |
| 69 | + timeout = '10000', |
| 70 | + maxTotal = '60000', |
| 71 | + maxIdle = '8', |
| 72 | + minIdle = '0' |
| 73 | + ); |
| 74 | + |
| 75 | +``` |
95 | 76 |
|
96 | 77 | ## 6.redis完整样例
|
97 |
| -### redis数据说明 |
| 78 | + |
| 79 | +```sql |
| 80 | +-- source |
| 81 | +CREATE TABLE SourceOne |
| 82 | +( |
| 83 | + id INT, |
| 84 | + age BIGINT, |
| 85 | + birth TIMESTAMP, |
| 86 | + todayTime TIME, |
| 87 | + todayDate DATE, |
| 88 | + price DECIMAL, |
| 89 | + name VARCHAR, |
| 90 | + phone VARCHAR, |
| 91 | + wechat VARCHAR, |
| 92 | + qq VARCHAR |
| 93 | +) WITH ( |
| 94 | + type = 'kafka11', |
| 95 | + bootstrapServers = 'kudu1:9092', |
| 96 | + zookeeperQuorum = 'kudu1:2181', |
| 97 | + offsetReset = 'latest', |
| 98 | + topic = 'tiezhu_in', |
| 99 | + enableKeyPartitions = 'false', |
| 100 | + topicIsPattern = 'false' |
| 101 | + ); |
| 102 | + |
| 103 | + |
| 104 | +CREATE TABLE SinkOne |
| 105 | +( |
| 106 | + id INT, |
| 107 | + age BIGINT, |
| 108 | + birth TIMESTAMP, |
| 109 | + todayTime TIME, |
| 110 | + todayDate DATE, |
| 111 | + price DECIMAL, |
| 112 | + name VARCHAR, |
| 113 | + phone VARCHAR, |
| 114 | + wechat VARCHAR, |
| 115 | + qq VARCHAR, |
| 116 | + PRIMARY KEY (id, name) |
| 117 | +) WITH ( |
| 118 | + type = 'redis', |
| 119 | + url = 'kudu1:6379', |
| 120 | + database = '0', |
| 121 | + -- (1 单机,2 哨兵, 3 集群) |
| 122 | + redisType = '1', |
| 123 | + tableName = 'demo', |
| 124 | + partitionedJoin = 'false' |
| 125 | + ); |
| 126 | + |
| 127 | +CREATE VIEW ViewOne AS |
| 128 | +SELECT id, |
| 129 | + age, |
| 130 | + birth, |
| 131 | + todayTime, |
| 132 | + todayDate, |
| 133 | + price, |
| 134 | + name, |
| 135 | + phone, |
| 136 | + wechat, |
| 137 | + qq |
| 138 | +FROM SourceOne SO; |
| 139 | + |
| 140 | +INSERT INTO SinkOne |
| 141 | +SELECT * |
| 142 | +FROM ViewOne; |
| 143 | + |
| 144 | +``` |
| 145 | + |
| 146 | +## 7.redis数据说明 |
| 147 | + |
98 | 148 | redis使用散列类型 hash 数据结构,key=tableName_primaryKey1_primaryKey2,value={column1=value1, column2=value2}
|
99 | 149 | 如果以班级class表为例,id和name作为联合主键,那么redis的结构为 <class_1_john ,{id=1, name=john, age=12}>
|
100 | 150 |
|
101 | 151 | ### 源表数据内容
|
| 152 | + |
| 153 | +```json |
| 154 | +{ |
| 155 | + "qq":63595541541, |
| 156 | + "todayTime":"10:19:40", |
| 157 | + "wechat":"微信号81850", |
| 158 | + "birth":"2021-01-19 10:19:40.075", |
| 159 | + "todayDate":"2021-01-19", |
| 160 | + "phone":18649852461, |
| 161 | + "price":1.4, |
| 162 | + "name":"tiezhu2", |
| 163 | + "id":2, |
| 164 | + "age":19 |
| 165 | +} |
102 | 166 | ```
|
103 |
| -{"name":"roc","channel":"daishu","age":2} |
104 |
| -``` |
| 167 | + |
105 | 168 | ### redis实际数据内容
|
106 |
| -``` |
107 |
| -127.0.0.1:6379> keys * |
108 |
| -1) "resultTable_roc" |
109 |
| -127.0.0.1:6379> hgetall resultTable_roc |
110 |
| -1) "channel" |
111 |
| -2) "daishu" |
112 |
| -3) "name" |
113 |
| -4) "roc" |
| 169 | + |
| 170 | +```shell |
| 171 | +kudu1_redis_docker:0>keys * |
| 172 | +1) "demo_2_tiezhu2" |
| 173 | +2) "demo_4_tiezhu2" |
| 174 | +3) "demo_3_yuange" |
| 175 | +kudu1_redis_docker:0>hgetall demo_2_tiezhu2 |
| 176 | +1) "qq" |
| 177 | +2) "63595541541" |
| 178 | +3) "todayTime" |
| 179 | +4) "10:19:40" |
| 180 | +5) "phone" |
| 181 | +6) "18649852461" |
| 182 | +7) "price" |
| 183 | +8) "1.400000000000000000" |
| 184 | +9) "name" |
| 185 | +10) "tiezhu2" |
| 186 | +11) "wechat" |
| 187 | +12) "微信号81850" |
| 188 | +13) "birth" |
| 189 | +14) "2021-01-19 10:19:40.075" |
| 190 | +15) "id" |
| 191 | +16) "2" |
| 192 | +17) "todayDate" |
| 193 | +18) "2021-01-19" |
| 194 | +19) "age" |
| 195 | +20) "19" |
| 196 | +kudu1_redis_docker:0> |
114 | 197 | ```
|
0 commit comments