[
https://issues.apache.org/jira/browse/CALCITE-3510?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Haisheng Yuan resolved CALCITE-3510.
------------------------------------
Fix Version/s: 1.22.0
Resolution: Fixed
Fixed in
https://github.com/apache/calcite/commit/54a6e3a78489e419477f5ca079bb1539ac284d6c,
thanks for the PR, [~x1q1j1]!
> Redis adapter
> -------------
>
> Key: CALCITE-3510
> URL: https://issues.apache.org/jira/browse/CALCITE-3510
> Project: Calcite
> Issue Type: New Feature
> Reporter: Forward Xu
> Assignee: Forward Xu
> Priority: Major
> Labels: pull-request-available
> Fix For: 1.22.0
>
> Time Spent: 12h 40m
> Remaining Estimate: 0h
>
> The Redis adapter allows querying of live data stored in Redis.Each Redis
> key/value pair is presented as a single row in Presto. Rows can be broken
> down into cells by using table definition files.
> Redis `string` ,`hash`, `sets`, `zsets`, `list` value types are supported;
> CSV format data
> {code:java}
> Set hello_world_1 1, james, 10
> Set hello_world_2 2,bond,20
> Set hello_world_3 3,lily,30
> Set hello_world_4 4,lucy,20
> {code}
> JSON format data
> {code:java}
> Set hello_foo_1 '{"id":1,"name":"james","age":110}'
> Set hello_foo_2 '{"id": 2, "name": "bond", "age": 210}'
> Set hello_foo_3 '{"id": 3, "name": "lily", "age": 310}'
> Set hello_foo_4 '{"id": 3, "name": "lucy", "age": 210}'
> {code}
> RAW format data
> {code:java}
> Set hello_raw_1 1, james, 10
> Set hello_raw_2 2,bond,20
> Set hello_raw_3 3,lily,30
> Set hello_raw_4 4, lucy, 20
> {code}
> We inserted data in three formats, one in CSV format, one in JSON format, and
> one in RAW format. This is the three formats we currently support, which will
> be demonstrated separately.
> Then you can define the corresponding mapping table in the JSON file:
> {code:java}
> {
> "version": "1.0",
> "defaultSchema": "foodmart",
> "schemas": [
> {
> "type": "custom",
> "name": "foodmart",
> "factory": "org.apache.calcite.adapter.redis.RedisSchemaFactory",
> "operand": {
> ```
> "host": "localhost",
> "port": 6379,
> "database": 0,
> "password": ""
> ```
> },
> "tables": [
> {
> "name": "raw_01",
> "factory": "org.apache.calcite.adapter.redis.RedisTableFactory",
> "operand": {
> ```
> "dataFormat": "csv",
> "keyDelimiter": ":",
> "fields": [
> {
> "name": "id",
> "type": "varchar",
> "mapping": "id"
> }
> ```
> ]
> }
> }
> ]
> }
> ]
> }
> {code}
> Here are a few details about the fields:
> keyDelimiter is used to split the value, the default is a colon, and the
> split value is used to map the field column. Only works for the CSV format.
> Format is used to specify the format of the data in Redis. Currently, it
> supports: CSV, JSON and RAW. The raw format keeps the original redis key and
> value intact and only one field key is used for the query. The details are
> not described below.
> The function of COLUMN_MAPPING is to map the columns of Redis to the
> underlying data. Since there is no concept of column under the Redis, the
> specific mapping method varies according to the format. For example, here
> CSV, we know that the CSV data will be formed after being parsed. A string
> array, the corresponding column_mapping is mapped to the index (subscript) of
> the underlying array. For example, here map id to subscript 2, map name to
> subscript 1 and so on.
> You can query the data in the Redis database:
> Mysql> select * from dla_person;
> ||name||id||age||
> |bond|20|2|
> |lily|30|3|
> |lucy|20|4|
> |james|10|1|
> 4 rows in set (0.18 sec)
> Students who are familiar with SQL must feel very cool, you can go to the
> familiar SQL syntax to operate the Redis database.
> JSON
> The above demonstrates the data in CSV format. Let's try the data in JSON
> format. Let's create a new table:
> {code:java}
> {
> "version": "1.0",
> "defaultSchema": "foodmart",
> "schemas": [
> {
> "type": "custom",
> "name": "foodmart",
> "factory": "org.apache.calcite.adapter.redis.RedisSchemaFactory",
> "operand": {
> ```
> "host": "localhost",
> "port": 6379,
> "database": 0,
> "password": ""
> ```
> },
> "tables": [
> {
> "name": "raw_01",
> "factory": "org.apache.calcite.adapter.redis.RedisTableFactory",
> "operand": {
> ```
> "dataFormat": "json",
> "fields": [
> {
> "name": "id",
> "type": "varchar",
> "mapping": "id"
> }
> ```
> ]
> }
> }
> ]
> }
> ]
> }
> {code}
> Note that we have specified COLUMN_MAPPING here, because the JSON data has a
> field name, so the column name of the Redis layer is mapped to the name of
> the field in the JSON data. Here, the Redis id column is deliberately mapped
> to Redis for demonstration purposes. The age, let's look at the results:
> Mysql> select * from dla_person_json;
> ||name||id||age||
> |lucy|210|3|
> |james|110|1|
> |bond|210|2|
> |lily|310|3|
> 4 rows in set (0.12 sec)
> As we wish, the id column shows the value of the corresponding age field in
> Redis.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)