ClickHouse使用问题——Serialization is not implemented
此系列的内容主要是介绍在使用ClickHouse中遇见的问题以及排除的思路或者方案或者仅仅是过程,所以内容可能会很短也可能会很长。主要的原因是目前ClickHouse相关问题的文章实在太少了。
问题
在一次对ClickHouse的视图数据集进行查询的时候出现的这样的错误
nested exception is ru.yandex.clickhouse.except.ClickHouseException: ClickHouse exception, code: 48, host: xxx.xxx.xxx.xxx, port: xxxx; Code: 48, e.displayText() = DB::Exception: Serialization is not implemented for data type Nothing: while converting '查询值' to Nothing (version 20.5.4.40 (official build))
异常中提示作为条件的字段进行筛选的时候字段没有序列化的异常。而当时查询的SQL是
select sum(字段1) from 视图数据集 where 字段2 in ('查询值') limit 100 offset 0
但是直接进行数据查询或者将查询条件设置为字段2 = '查询值'
的时候SQL却是可以执行的。
问题排查
原始建表语句
CREATE VIEW
IF
NOT EXISTS 视图数据集 ON CLUSTER 节点 AS (
SELECT
字段1 AS 视图字段1,
字符串字段2 AS 视图字段2,
字符串字段3 AS 视图字段3,
NULL AS 视图字段4,
NULL AS 视图字段5,
NULL AS 视图字段6
FROM 数据集1
UNION ALL
SELECT NULL AS
NULL AS 视图字段1,
NULL AS 视图字段2,
NULL AS 视图字段3,
字段4 AS 视图字段4,
字段5 AS 视图字段5,
字段6 AS 视图字段6
FROM 数据集2
)
在后续对视图数据集进行操作的时候发现当对视图字段2
和视图字段3
进行操作的时候会出现上述异常。
解决方案
在将字符串类型的字段默认值设置为’'后查询正常
修改后建表语句
CREATE VIEW
IF
NOT EXISTS 视图数据集 ON CLUSTER 节点 AS (
SELECT
字段1 AS 视图字段1,
字符串字段2 AS 视图字段2,
字符串字段3 AS 视图字段3,
NULL AS 视图字段4,
NULL AS 视图字段5,
NULL AS 视图字段6
FROM 数据集1
UNION ALL
SELECT NULL AS
NULL AS 视图字段1,
'' AS 视图字段2,
'' AS 视图字段3,
字段4 AS 视图字段4,
字段5 AS 视图字段5,
字段6 AS 视图字段6
FROM 数据集2
)