Flink SQL 解析嵌套的 JSON 数据

在日常的开发中,最常用的数据格式是 JSON ,并且有的时候 JSON 的格式是非常复杂的(嵌套的格式),那在 Flink SQL 中进行解析的时候也会相当麻烦一点,下面将会演示如何在 DDL 里面定义 Map、Array、Row 类型的数据,以及在 SQL 里面如何获里面的值

数据格式如下:

以下数据完全是自己造的,没有任何实际含义

{
 "funcName": "test",
 "data": {
  "snapshots": [{
   "content_type": "application/x-gzip-compressed-jpeg",
   "url": "https://blog.csdn.net/xianpanjia4616"
  }],
  "audio": [{
   "content_type": "audio/wav",
   "url": " https://bss.csdn.net/m/topic/blog_star2020/detail?username=xianpanjia4616"
  }]
 },
 "resultMap": {
  "result": {
   "cover": "/data/test/log.txt"
  },
  "isSuccess": true
 },
 "meta": {
  "video_type": "normal"
 },
 "type": 2,
 "timestamp": 1610549997263,
 "arr": [{
  "address": "北京市海淀区",
  "city": "beijing"
 }, {
  "address": "北京市海淀区",
  "city": "beijing"
 }, {
  "address": "北京市海淀区",
  "city": "beijing"
 }],
 "map": {
  "flink": 456
 },
 "doublemap": {
  "inner_map": {
   "key": 123
  }
 }
}

上面的数据包含了 Map、Array、Row 等类型, 对于这样的数据格式,在建表 DDL 里面应该如何定义呢?

定义 DDL

CREATE TABLE kafka_source (
    funcName STRING,
    data ROW<snapshots ARRAY<ROW<content_type STRING,url STRING>>,audio ARRAY<ROW<content_type STRING,url STRING>>>,
    resultMap ROW<`result` MAP<STRING,STRING>,isSuccess BOOLEAN>,
    meta  MAP<STRING,STRING>,
    `type` INT,
    `timestamp` BIGINT,
    arr ARRAY<ROW<address STRING,city STRING>>,
    map MAP<STRING,INT>,
    doublemap MAP<STRING,MAP<STRING,INT>>,
    proctime as PROCTIME()
) WITH (
    'connector' = 'kafka', -- 使用 kafka connector
    'topic' = 'test',  -- kafka topic
    'properties.bootstrap.servers' = 'master:9092,storm1:9092,storm2:9092',  -- broker连接信息
    'properties.group.id' = 'jason_flink_test', -- 消费kafka的group_id
    'scan.startup.mode' = 'latest-offset',  -- 读取数据的位置
    'format' = 'json',  -- 数据源格式为 json
    'json.fail-on-missing-field' = 'true', -- 字段丢失任务不失败
    'json.ignore-parse-errors' = 'false'  -- 解析失败跳过
)

解析 SQL

select
funcName,
doublemap['inner_map']['key'],
count(data.snapshots[1].url),
`type`,
TUMBLE_START(proctime, INTERVAL '30' second) as t_start
from kafka_source
group by TUMBLE(proctime, INTERVAL '30' second),funcName,`type`,doublemap['inner_map']['key']

SQL 运行的结果

4> (true,test,123,6,2,2021-01-15T03:31)
4> (false,test,123,6,2,2021-01-15T03:31)
4> (true,test,123,8,2,2021-01-15T03:31)
4> (false,test,123,8,2,2021-01-15T03:31)
4> (true,test,123,10,2,2021-01-15T03:31)
4> (false,test,123,10,2,2021-01-15T03:31)
4> (true,test,123,13,2,2021-01-15T03:31)
4> (false,test,123,13,2,2021-01-15T03:31)
4> (true,test,123,15,2,2021-01-15T03:31)
4> (true,test,123,3,2,2021-01-15T03:31:30)

说明数据都可以正常的解析出来,如果遇到更加复杂的 JSON 格式的数据,只需要比葫芦画瓢就可以了,在复杂的格式都不是问题.

数据类型映射

目前,JSON 模式总是从表模式派生。目前还不支持显式定义 JSON 模式。Flink JSON 格式使用 jackson databind API 来解析和生成JSON 字符串。下表列出了从 Flink 类型到 JSON 类型的映射。

注意事项:

  1. Json 中的每个 {} 都需要用 Row 类型来表示

  2. Json 中的每个 [] 都需要用 Arrary 类型来表示

  3. 数组的下标是从 1 开始的不是 0 如上面 SQL 中的 data.snapshots[1].url

  4. 关键字在任何地方都需要加反引号 如上面 SQL 中的 `type`

  5. select 语句中的字段类型和顺序一定要和结果表的字段类型和顺序保持一致

  6. UDF 可以直接在建表语句中使用

最后再插一个投票环节,CSDN 2020 年度博客之星评选, 每天都可以投票 截止到1月24号,感谢大家的支持,投票地址:  https://bss.csdn.net/m/topic/blog_star2020/detail?username=xianpanjia4616

推荐阅读:

Flink SQL 中动态修改 DDL 的属性

JasonLee,公众号:JasonLee的博客Flink SQL 中动态修改 DDL 的属性

Apache Flink 1.12.0 升级说明

JasonLee,公众号:JasonLee的博客Apache Flink 1.12.0 升级说明

  • 12
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
### 回答1: 在Flink SQL中,解析JSON的函数有以下几种: 1. JSON_VALUE:用于从JSON字符串中提取指定的值。 2. JSON_OBJECT:用于创建一个JSON对象。 3. JSON_ARRAY:用于创建一个JSON数组。 4. JSON_PARSE:用于将JSON字符串解析JSON对象或JSON数组。 5. JSON_EXISTS:用于检查JSON字符串中是否存在指定的键或路径。 6. JSON_PRETTY:用于将JSON字符串格式化为易于阅读的形式。 以上是Flink SQL解析JSON的常用函数,可以根据具体需求选择使用。 ### 回答2: 在Flink SQL中,解析JSON数据的函数被称为JSON函数,它允许用户将JSON格式的数据解析Flink SQL查询所需的格式。 在Flink SQL中,用户可以使用JSON函数将一个JSON字符串转换为一个Flink SQL的ROW类型,这个ROW类型包含了JSON中所有的key和value。此外,用户还可以使用JSON函数将Flink SQL的ROW类型转换为JSON字符串。 在利用JSON函数解析JSON数据之前,需要先将JSON数据定义为Flink SQL的源表,这可以使用CREATE TABLE语句来完成。在CREATE TABLE语句中,用户需要指定JSON数据所在的路径以及JSON数据中各个字段的名称和数据类型。 接下来,用户可以利用SELECT语句来解析JSON数据。在SELECT语句中,用户可以使用JSON函数来解析JSON数据,并且可以使用标准的SQL语法来查询JSON数据中的某些字段。 以下是JSON函数的一些常用语法: 1. JSON_OBJECT(str*):返回一个JSON对象,这个对象中包含了所有给定的key-value对。 2. JSON_ARRAYAGG(expr):将expr转化成一个JSON数组。 3. JSON_OBJECTAGG(key, value):返回一个JSON对象,这个对象中包含了所有给定key-value对。 4. JSON_EXTRACT(json, path):返回一个给定JSON对象中指定path的值。 5. JSON_ARRAY(expr1, expr2, …):返回一个指定的JSON数组。 总结一下,在Flink SQL中,利用JSON函数解析JSON数据的流程如下: 1. 将JSON数据定义为Flink SQL的源表。 2. 在SELECT语句中使用JSON函数来解析JSON数据。 3. 使用标准的SQL语法查询JSON数据中的某些字段。 最后,需要注意的是,Flink SQL中的JSON函数文档已经非常详细,用户可以按需查阅。此外,Flink SQL官方文档中还提供了很多例子,用户可以参考这些例子来学习如何使用JSON函数。 ### 回答3: FlinkSQL是Apache Flink中的一种SQL分析工具,通过使用FlinkSQL可以快速地对数据进行分析和处理。在FlinkSQL中,解析JSON是一项常见的任务,这可以通过使用解析JSON的函数来实现。 在FlinkSQL中,解析JSON的函数包括:JSON_VALUE、JSON_OBJECT、JSON_ARRAY等。其中,JSON_VALUE函数用于从JSON字符串中提取特定的值,JSON_OBJECT函数用于创建一个JSON对象,而JSON_ARRAY函数用于创建JSON数组。 JSON_VALUE函数的语法是: JSON_VALUE(json, path) 其中,json参数指的是要解析JSON字符串,path参数则是JSON路径表达式。示例: SELECT JSON_VALUE('{"name":"xiaoming","age":18}','$.age') as age 这将返回18,因为它从JSON字符串中选择了“age”值。 JSON_OBJECT函数的语法是: JSON_OBJECT(key1, value1, key2, value2, …) 其中,key和value是JSON中的键值对。示例: SELECT JSON_OBJECT('name', 'xiaoming', 'age', 18) as user 这将返回一个包含'name'为'xiaoming','age'为18的JSON对象。 JSON_ARRAY函数的语法是: JSON_ARRAY(value1, value2, ...) 其中,value可以是任何JSON数据类型,例如字符串、数字、对象或数组。示例: SELECT JSON_ARRAY('xiaoming', 'xiaohong', 'xiaobai') as users 这将返回包含三个字符串值的JSON数组。 总的来说,FlinkSQL中的解析JSON函数提供了一种简单而灵活的方法来解析JSON数据。使用这些函数,可以轻松地从JSON字符串中提取所需的数据,并将其转换为其他格式进行进一步处理。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JasonLee实时计算

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

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

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

打赏作者

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

抵扣说明:

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

余额充值