ClickHouse使用问题——Serialization is not implemented

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
	)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java Serialization 是 Java 语言中的一种序列化方式,用于将对象转换为字节流,以便在网络上传输或保存到文件中。如果你想要在 C++ 中使用 Java Serialization,你需要使用一个支持 Java Serialization 的第三方库,如 Boost 库。 下面是一个使用 Boost 库实现 Java Serialization 的示例代码: ```cpp #include <iostream> #include <fstream> #include <boost/archive/text_oarchive.hpp> #include <boost/archive/text_iarchive.hpp> #include <boost/serialization/string.hpp> #include <boost/serialization/vector.hpp> class Person { public: std::string name; int age; std::vector<std::string> hobbies; template<class Archive> void serialize(Archive & ar, const unsigned int version) { ar & name; ar & age; ar & hobbies; } }; int main() { // 创建一个 Person 对象 Person person; person.name = "Tom"; person.age = 20; person.hobbies.push_back("reading"); person.hobbies.push_back("running"); person.hobbies.push_back("swimming"); // 序列化 Person 对象到文件中 std::ofstream ofs("person.txt"); boost::archive::text_oarchive oa(ofs); oa << person; // 从文件中反序列化 Person 对象 std::ifstream ifs("person.txt"); boost::archive::text_iarchive ia(ifs); Person newPerson; ia >> newPerson; // 输出反序列化后的 Person 对象 std::cout << "Name: " << newPerson.name << std::endl; std::cout << "Age: " << newPerson.age << std::endl; std::cout << "Hobbies: "; for (const auto& hobby : newPerson.hobbies) { std::cout << hobby << " "; } std::cout << std::endl; return 0; } ``` 在上述示例中,我们使用了 Boost 库的 archive 模块来实现序列化和反序列化。我们定义了一个名为 Person 的类,并为其添加了一个 serialize() 方法来指定序列化和反序列化的方式。在主函数中,我们创建了一个 Person 对象并序列化到文件中,然后从文件中反序列化出一个新的 Person 对象并输出其属性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大·风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值