Trino 에서 Redis 테이블을 조회하면 다음과 같은 오류가 난다.
no mapping for column handle RedisColumnHandle(ordinalPosition=0, name=col1_name,
type=varchar, mapping=null, dataFormat=null, formatHint=null, keyDecoder=false, internal=false)
mapping=null · dataFormat=null 이 핵심이다. 테이블 정의 파일에 컬럼은 선언했는데 그 컬럼이 Redis 값의 어느 부분에 대응하는지를 적지 않았다는 뜻이다.
Redis 커넥터는 카탈로그 설정의 redis.table-description-dir 아래에 있는 JSON 으로 테이블을 정의한다. 파일 이름은 보통 <schema>.<table>.json 이다.
{
"tableName": "docs",
"schemaName": "default",
"key": {
"dataFormat": "raw",
"fields": [
{ "name": "redis_key", "type": "VARCHAR", "hidden": false }
]
},
"value": {
"dataFormat": "hash",
"fields": [
{ "name": "name_of_first_field", "mapping": "NAME_OF_FIRST_FIELD", "type": "VARCHAR" },
{ "name": "name_of_second_field", "mapping": "NAME_OF_SECOND_FIELD", "type": "VARCHAR" },
{ "name": "name_of_third_field", "mapping": "NAME_OF_THIRD_FIELD", "type": "VARCHAR" }
]
}
}
mapping 은 Redis 쪽 이름, name 은 Trino 에서 보일 컬럼 이름이다. 둘이 같아도 mapping 을 생략하면 안 된다. 생략하면 위의 mapping=null 오류가 그대로 난다.
| Redis 자료형 | dataFormat |
|---|---|
HSET 으로 넣은 해시 |
hash |
| JSON 문자열 | json |
| 단일 문자열 값 | raw |
해시인데 json 으로 선언하면 디코더가 값을 파싱하지 못해 전 컬럼이 null 이 되고, Cannot invoke io.trino.decoder.FieldValueProvider.isNull() because currentRowValues[field] is null 같은 오류로 이어진다.
실제로 어떤 모양인지는 Redis 에서 직접 확인한다.
TYPE doc:1
HGETALL doc:1
GET doc:1
avro 나 protobuf 를 dataFormat 으로 지정하면 스키마 정의가 따로 필요하다. 그 항목을 주지 않으면 이 오류가 난다. 해시나 JSON 을 쓴다면 애초에 그 포맷을 지정하지 않는다.
connector.name=redis
redis.table-names=default.docs
redis.nodes=redis01:6379
redis.key-prefix-schema-table=true
redis.key-delimiter=:
redis.table-description-dir=/etc/trino/redis
redis.hide-internal-columns=false
redis.key-prefix-schema-table=true 로 두면 <schema>:<table>: 로 시작하는 키만 스캔한다. 키 접두사가 doc 이고 구분자가 : 인 데이터를 읽으려면 스키마·테이블 이름을 그 접두사에 맞추거나 이 옵션을 꺼야 한다.
테이블 정의 파일은 코디네이터와 모든 워커에 같은 경로로 배포해야 하고, 커넥터가 시작할 때 읽으므로 변경 후 재시작이 필요하다.
SHOW TABLES FROM redis.default;
DESCRIBE redis.default.docs;
SELECT * FROM redis.default.docs LIMIT 10;
redis.hide-internal-columns=false 로 두면 _key · _value 같은 내부 컬럼이 보여 실제로 어떤 원본이 들어오는지 확인할 수 있다. 문제 해결 중에는 켜 두는 편이 낫다.
Redis 커넥터는 읽기 전용이며 INSERT 를 지원하지 않는다. 그리고 조회 때마다 키 공간을 훑으므로 키가 많으면 느리다. 접두사로 범위를 좁히고, 상시 질의 대상으로 쓰기보다는 적재 경로 점검용으로 쓰는 편이 현실적이다.