|
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