sql解析json数组(mysql解析json数组)
大家好,今天给各位分享sql解析json数组的一些知识,其中也会对mysql解析json数组进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!
SQL | 处理json的几个函数
处理JSON数据在SQL中是常见操作,本文将介绍两个主要的函数:get_json_object和to_json。
get_json_object函数用于从JSON字符串中提取值。函数语法为:get_json_object(json_string, path)。其中,json_string是JSON对象变量,path参数使用$表示变量标识,通过点或方括号读取对象或数组。若JSON字符串无效,则函数返回NULL,每次只能返回一个数据项。
实例演示如下:
假设test表中字段data的JSON结构如下:
(1)获取单层值
(2)获取多层值
(3)获取数组值
to_json函数则用于将SQL查询结果转换为JSON格式。其语法为:to_json(expr, [options])。其中,expr表示要转换的SQL表达式,options为可选参数,用于指定转换格式。
参考资料:
1、【Hive】解析json(get_json_object)
2、to_json函数(Databricks SQL)
mysql5.7以下怎么解析json
我们知道,JSON是一种轻量级的数据交互的格式,大部分NO SQL数据库的存储都用JSON。MySQL从5.7开始支持JSON格式的数据存储,并且新增了很多JSON相关函数。MySQL 8.0又带来了一个新的把JSON转换为TABLE的函数JSON_TABLE,实现了JSON到表的转换。
举例一
我们看下简单的例子:
简单定义一个两级JSON对象
mysql> set@ytt='{"name":[{"a":"ytt","b":"action"},{"a":"dble","b":"shard"},{"a":"mysql","b":"oracle"}]}';Query OK, 0 rows affected(0.00 sec)
第一级:
mysql> select json_keys(@ytt);+-----------------+| json_keys(@ytt)|+-----------------+| ["name"]|+-----------------+1 row in set(0.00 sec)
第二级:
mysql> select json_keys(@ytt,'$.name[0]');+-----------------------------+| json_keys(@ytt,'$.name[0]')|+-----------------------------+| ["a","b"]|+-----------------------------+1 row in set(0.00 sec)
我们使用MySQL 8.0的JSON_TABLE来转换@ytt。
mysql> select* from json_table(@ytt,'$.name[*]' columns(f1 varchar(10) path'$.a', f2 varchar(10) path'$.b')) as tt;
+-------+--------+
| f1| f2|
+-------+--------+
| ytt| action|
| dble| shard|
| mysql| oracle|
+-------+--------+
3 rows in set(0.00 sec)
举例二
再来一个复杂点的例子,用的是EXPLAIN的JSON结果集。
JSON串@json_str1。
set@json_str1='{"query_block":{"select_id": 1,"cost_info":{"query_cost":"1.00"},"table":{"table_name":"bigtable","access_type":"const","possible_keys": ["id" ],"key":"id","used_key_parts": ["id" ],"key_length":"8","ref": ["const" ],"rows_examined_per_scan": 1,"rows_produced_per_join": 1,"filtered":"100.00","cost_info":{"read_cost":"0.00","eval_cost":"0.20","prefix_cost":"0.00","data_read_per_join":"176"},"used_columns": ["id","log_time","str1","str2" ]}}}';
第一级:
mysql> select json_keys(@json_str1) as'first_object';+-----------------+| first_object|+-----------------+| ["query_block"]|+-----------------+1 row in set(0.00 sec)
第二级:
mysql> select json_keys(@json_str1,'$.query_block') as'second_object';+-------------------------------------+| second_object|+-------------------------------------+| ["table","cost_info","select_id"]|+-------------------------------------+1 row in set(0.00 sec)
第三级:
mysql> select json_keys(@json_str1,'$.query_block.table') as'third_object'\G*************************** 1. row***************************third_object: ["key","ref","filtered","cost_info","key_length","table_name","access_type","used_columns","possible_keys","used_key_parts","rows_examined_per_scan","rows_produced_per_join"]1 row in set(0.01 sec)
第四级:
mysql> select json_extract(@json_str1,'$.query_block.table.cost_info') as'forth_object'\G*************************** 1. row***************************forth_object:{"eval_cost":"0.20","read_cost":"0.00","prefix_cost":"0.00","data_read_per_join":"176"}1 row in set(0.00 sec)
那我们把这个JSON串转换为表。
SELECT* FROM JSON_TABLE(@json_str1,
"$.query_block"
COLUMNS(
rowid FOR ORDINALITY,
NESTED PATH'$.table'
COLUMNS(
a1_1 varchar(100) PATH'$.key',
a1_2 varchar(100) PATH'$.ref[0]',
a1_3 varchar(100) PATH'$.filtered',
nested path'$.cost_info'
columns(
a2_1 varchar(100) PATH'$.eval_cost',
a2_2 varchar(100) PATH'$.read_cost',
a2_3 varchar(100) PATH'$.prefix_cost',
a2_4 varchar(100) PATH'$.data_read_per_join'
),
a3 varchar(100) PATH'$.key_length',
a4 varchar(100) PATH'$.table_name',
a5 varchar(100) PATH'$.access_type',
a6 varchar(100) PATH'$.used_key_parts[0]',
a7 varchar(100) PATH'$.rows_examined_per_scan',
a8 varchar(100) PATH'$.rows_produced_per_join',
a9 varchar(100) PATH'$.key'
),
NESTED PATH'$.cost_info'
columns(
b1_1 varchar(100) path'$.query_cost'
),
c INT path"$.select_id"
)
) AS tt;
+-------+------+-------+--------+------+------+------+------+------+----------+-------+------+------+------+------+------+------+
| rowid| a1_1| a1_2| a1_3| a2_1| a2_2| a2_3| a2_4| a3| a4| a5| a6| a7| a8| a9| b1_1| c|
+-------+------+-------+--------+------+------+------+------+------+----------+-------+------+------+------+------+------+------+
| 1| id| const| 100.00| 0.20| 0.00| 0.00| 176| 8| bigtable| const| id| 1| 1| id| NULL| 1|
| 1| NULL| NULL| NULL| NULL| NULL| NULL| NULL| NULL| NULL| NULL| NULL| NULL| NULL| NULL| 1.00| 1|
+-------+------+-------+--------+------+------+------+------+------+----------+-------+------+------+------+------+------+------+
2 rows in set(0.00 sec)
当然,JSON_table函数还有其他的用法,我这里不一一列举了,详细的参考手册。
请点击输入图片描述
请点击输入图片描述
修改回答
flink sql 处理json对象数组,列变多行
在 Flink SQL中处理 JSON对象数组并将其转换为多行数据,可以使用 CROSS JOIN UNNEST函数。根据您提供的数据格式和 SQL代码,以下是处理 JSON对象数组并将其列转换为多行的解决方案:
解决方案创建 Kafka源表:首先,您已经正确地创建了一个 Kafka源表 kafkastream,其中 data字段被定义为 ARRAY<ROW<code string, dealtime string>>类型。
使用 CROSS JOIN UNNEST展开数组:使用 CROSS JOIN UNNEST函数将 data数组中的每个元素展开为多行。以下是修正后的 SQL查询:
SELECT t.code, DATE_FORMAT(t.dealtime,'yyyyMMdd') AS date, kafkastream.proctime, kafkastream.tsFROM kafkastreamCROSS JOIN UNNEST(kafkastream.`data`) AS t(code, dealtime)关键点说明CROSS JOIN UNNEST:
CROSS JOIN UNNEST用于将数组类型的字段展开为多行。
语法为 CROSS JOIN UNNEST(array_column) AS alias(column1, column2,...),其中 alias是展开后的表的别名,column1, column2,...是展开后的列名。
字段引用:
在展开后的查询中,需要通过别名(如 t)引用展开后的字段(如 t.code和 t.dealtime)。
同时,原始表的其他字段(如 proctime和 ts)需要通过原始表名(如 kafkastream)引用。
日期格式化:
使用 DATE_FORMAT函数将 dealtime字段格式化为 yyyyMMdd格式。
完整示例以下是完整的 Flink SQL代码,包括表创建和查询:
--创建 Kafka源表CREATE TABLE kafkastream( `source_time` STRING, queue_id STRING, `count` BIGINT, `data` ARRAY<ROW<code STRING, dealtime STRING>>, proctime AS PROCTIME(), ts TIMESTAMP(3), WATERMARK FOR ts AS ts- INTERVAL'2' SECOND) WITH('connector'='kafka','topic'='test_3','properties.group.id'='test3','scan.startup.mode'='latest-offset','format'='json','json.fail-on-missing-field'='false');--查询并展开 JSON数组SELECT t.code, DATE_FORMAT(t.dealtime,'yyyyMMdd') AS date, kafkastream.proctime, kafkastream.tsFROM kafkastreamCROSS JOIN UNNEST(kafkastream.`data`) AS t(code, dealtime);注意事项字段名大小写:
在 Flink SQL中,字段名默认是大小写敏感的。如果 JSON中的字段名是 code和 dealtime,则在 SQL中也需要使用相同的名称。
数据类型匹配:
确保 data数组中的字段类型与 UNNEST中定义的类型一致。例如,code是 STRING类型,dealtime也是 STRING类型。
性能考虑:
如果 data数组很大,展开操作可能会产生大量数据。请确保下游处理能够处理这种数据膨胀。
通过以上方法,您可以成功地将 JSON对象数组展开为多行数据,并在 Flink SQL中进行处理。
sql解析json数组的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于mysql解析json数组、sql解析json数组的信息别忘了在本站进行查找哦。