clickhouse接收kafka传送过来的json数据(待续)

通过思路:应用数据——>kafka——>clickhouse

例子1:数据类型:

{"b":[{"a":2,"b":"abc"}]}

with '{"b":[{"a":2,"b":"abc"}]}' as k
SELECT 
  visitParamExtractRaw(k, 'b') AS c,
  JSONExtractRaw(k, 'b') AS b,
  JSONExtractArrayRaw(c) AS arr,
  JSONExtractString(arrayJoin(arr),'b') as s,
  toTypeName(c);

对数据进行测试

最后一行则是对数据格式进行查看,方便建表时候建相应的数据格式。

另外在处理kafka过来的json数据的时候发现如果数据量过大的情况会无法提取数据进行入库,而且select数据的时候会显示不全,暂时没找到解决办法;

例子2:数据类型json

[{"a":"aaa","b":"bbb","c":{"d":[{"aa":1,"bb":"bbbbbb"},{"aa":2,"bb":"dddddd"}]},"e":"eeee"}]

with '[{"a":"aaa","b":"bbb","c":{"d":[{"aa":1,"bb":"bbbbbb"},{"aa":2,"bb":"dddddd"}]},"e":"eeee"}]' as raw
select
	visitParamExtractInt(json,'aa'),
	visitParamExtractString(json,'bb')
from
(select
	JSONExtractArrayRaw(raw) as a,
	arrayJoin(a) as b,
	JSONExtractRaw(b,'a') as a1,
	JSONExtractRaw(b,'c') as c1,
	JSONExtractArrayRaw(c1,'d') as d1,
	arrayJoin(d1) as json);

多层json数据提取。

 以上是对json数据的提取,下面就需要建相应的接收表格对数据进行存储。

CREATE TABLE db_test.target
(
    `aa` Int8,
    `bb` String
)
ENGINE = MergeTree()
ORDER BY sendTime

建kafka引擎的数据源

CREATE TABLE db_test.source
(
    msg String
)
ENGINE = Kafka()
SETTINGS kafka_broker_list = '1.1.1.1:9092', 
         kafka_topic_list = 'JSON_TOPIC',
         kafka_group_name = 'group_01', 
         kafka_format = 'JSONAsString',
         kafka_skip_broken_messages = 1,
         kafka_num_consumers = 1,
		 input_format_import_nested_json = 1,
		 input_format_allow_errors_num=100;

建转换表

CREATE MATERIALIZED VIEW db_test.source_mv TO db_test.target AS
SELECT
    visitParamExtractInt(json, 'aa'),
    visitParamExtractString(json, 'bb')
FROM
(
    SELECT
        JSONExtractArrayRaw(raw) AS a,
        arrayJoin(a) AS b,
        JSONExtractRaw(b, 'a') AS a1,
        JSONExtractRaw(b, 'c') AS c1,
        JSONExtractArrayRaw(c1, 'd') AS d1,
        arrayJoin(d1) AS json from db_test.source865
);

例子3:数据类型json

[{"a":"aaa","b":"bbb","c":{"d":[{"aa":1,"bb":"bbbbbb","cc":"{\"commonInfo\":{\"relationType\":\"\",\"vehicleReidFeature\":\"-0.0062166885,0.053562667,0.08259065,0.0448814\"}}"},{"aa":2,"bb":"dddddd","cc":"{\"commonInfo\":{\"relationType\":\"\",\"vehicleReidFeature\":\"-0.0055555555,0.055555555,0.05555555,0.0555555\"}}"}]},"e":"eeee"}]

方便观看进行格式化json格式

 

该数据为从kafka 中读取的数据,可以看到里面带有转义符,但是如果直接通过insert into存储到数据库中,该转义符就会消失。目前没找到好的办法直接将该数据通过clickhouse的kafka引擎直接读取该数据入库。

将该部分呢数据插入数据库:

INSERT INTO db_test.test_string(t,v) values(now(),'[{"a":"aaa","b":"bbb","c":{"d":[{"aa":1,"bb":"bbbbbb","cc":"{\"commonInfo\":{\"relationType\":\"\",\"vehicleReidFeature\":\"-0.0062166885,0.053562667,0.08259065,0.0448814\"}}"},{"aa":2,"bb":"dddddd","cc":"{\"commonInfo\":{\"relationType\":\"\",\"vehicleReidFeature\":\"-0.0055555555,0.055555555,0.05555555,0.0555555\"}}"}]},"e":"eeee"}]');

插入结果:发现转义字符“\”已经被自动去掉。如下图

 通过JSONExtractArrayRaw进行提取数据结果为空:

select JSONExtractArrayRaw(v) from db_test.test_string where t='2023-04-16 20:05:18';

通过 visitParamExtractRaw对字段进行提取:

select visitParamExtractRaw(v,'a') from db_test.test_string where t='2023-04-16 20:05:18';

 

 继续进行解析,发现一个奇怪现象:

select visitParamExtractRaw(visitParamExtractRaw(visitParamExtractRaw(v,'c'),'d'),'cc') from db_test.test_string where t='2023-04-16 20:05:18';

显示的结果是不全的,如下图 

而且通过JSONExtractString均无法解析,但是通过toTypeName(raw)显示确实为string类型。

 后来尝试将转义字符\转换成\\,转换后再重新插入数据库

INSERT INTO db_test.test_string(t,v) values(now(),'[{"a":"aaa","b":"bbb","c":{"d":[{"aa":1,"bb":"bbbbbb","cc":"{\\"commonInfo\\":{\\"relationType\\":\\"\\",\\"vehicleReidFeature\\":\\"-0.0062166885,0.053562667,0.08259065,0.0448814\\"}}"},{"aa":2,"bb":"dddddd","cc":"{\\"commonInfo\\":{\\"relationType\\":\\"\\",\\"vehicleReidFeature\\":\\"-0.0055555555,0.055555555,0.05555555,0.0555555\\"}}"}]},"e":"eeee"}]');

 经过层层剥离:

select visitParamExtractString(json,'cc'),visitParamExtractInt(json,'aa') from (select arrayJoin(JSONExtractArrayRaw(JSONExtractRaw(arrayJoin(JSONExtractArrayRaw(v)),'c'),'d')) as json from db_test.test_string where t='2023-04-16 20:25:31');

 得到想要的结果,但是问题又来了,如果该数据(带转义字符\)是从kafka过来的,要直接通过clickhouse的kafka引擎直接拉取数据入库是没办法在拉取过程中进行\转换成\\,这样就没办法进行json数据提取。甚至都没办法将原始数据入库。会一直报错。

CREATE TABLE db_test.source
(
	`msg` String
)
ENGINE = Kafka()
SETTINGS kafka_broker_list = '1.1.1.1:9092', 
         kafka_topic_list = 'json_test',
         kafka_group_name = 'my_group', 
         kafka_format = 'JSONAsString',
         kafka_skip_broken_messages = 1,
         kafka_num_consumers = 1,
		 input_format_import_nested_json = 1,
		 input_format_allow_errors_num=100;

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ClickHouse是一个高性能的列式数据库管理系统,可以与各种数据源进行集成,包括Kafka消息队列。集成Kafka可以让ClickHouse实时消费Kafka中的数据,并将其存储到ClickHouse中进行分析和查询。下面是将ClickHouse集成Kafka的一些步骤: 1. 安装KafkaClickHouse 首先要安装KafkaClickHouseKafka可以从官网下载最新版本的程序包。ClickHouse也可以从官网下载相应的程序包进行安装。 2. 创建Kafka主题 在Kafka中创建一个主题,用于存储要传输到ClickHouse数据。可以使用Kafka自带的命令行工具创建主题。例如: ``` bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic clickhouse_topic ``` 3. 安装Kafka引擎插件 ClickHouse提供了Kafka引擎插件,可以通过它与Kafka进行集成。可以从ClickHouse官网下载最新的引擎插件,并将其安装到ClickHouse中。安装完成后,需要重新启动ClickHouse服务。 4. 创建表 在ClickHouse中创建表,用于存储从Kafka中读取的数据。可以使用以下命令创建表: ``` CREATE TABLE kafka_table (key String, value String) ENGINE = Kafka('localhost:9092', 'clickhouse_topic', 'group1', 'JSONEachRow'); ``` 其中,'localhost:9092'是Kafka集群的地址,'clickhouse_topic'是要消费的主题名称,'group1'是消费者组的名称,'JSONEachRow'表示从Kafka中读取的消息是JSON格式。 5. 查询数据ClickHouse中使用SELECT语句查询从Kafka中读取的数据。例如: ``` SELECT * FROM kafka_table; ``` 这将返回存储在kafka_table表中的所有数据。 以上是将ClickHouse集成Kafka的基本步骤,可以根据具体情况进行调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值