[ 更换 ]
热门城市
北京上海广州深圳成都杭州南京武汉天津西安重庆青岛沈阳长沙大连厦门无锡福州济南宁波昆明苏州郑州长春合肥南昌哈尔滨常州烟台南宁温州石家庄太原珠海南通扬州贵阳东莞徐州大庆佛山威海洛阳淮安呼和浩特镇江潍坊桂林中山临沂咸阳包头嘉兴惠州泉州三亚赣州九江金华泰安榆林许昌新乡舟山慈溪南阳聊城海口东营淄博漳州保定沧州丹东宜兴绍兴唐山湖州揭阳江阴营口衡阳郴州鄂尔多斯泰州义乌汕头宜昌大同鞍山湘潭盐城马鞍山襄樊长治日照常熟安庆吉林乌鲁木齐兰州秦皇岛肇庆西宁介休滨州台州廊坊邢台株洲德阳绵阳双流平顶山龙岩银川芜湖晋江连云港张家港锦州岳阳长沙县济宁邯郸江门齐齐哈尔昆山柳州绍兴县运城齐河衢州太仓张家口湛江眉山常德盘锦枣庄资阳宜宾赤峰余姚清远蚌埠宁德德州宝鸡牡丹江阜阳莆田诸暨黄石吉安延安拉萨海宁通辽黄山长乐安阳增城桐乡上虞辽阳遵义韶关泸州南平滁州温岭南充景德镇抚顺乌海荆门阳江曲靖邵阳宿迁荆州焦作丹阳丽水延吉茂名梅州渭南葫芦岛娄底滕州上饶富阳内江三明淮南孝感溧阳乐山临汾攀枝花阳泉长葛汉中四平六盘水安顺新余晋城自贡三门峡本溪防城港铁岭随州广安广元天水遂宁萍乡西双版纳绥化鹤壁湘西松原阜新酒泉张家界黔西南保山昭通河池来宾玉溪梧州鹰潭钦州云浮佳木斯克拉玛依呼伦贝尔贺州通化朝阳百色毕节贵港丽江安康德宏朔州伊犁文山楚雄嘉峪关凉山雅安西藏四川广东河北山西辽宁黑龙江江苏浙江安徽福建江西山东河南湖北湖南海南贵州云南陕西甘肃青海台湾内蒙古广西宁夏香港澳门
培训资讯网 - 为兴趣爱好者提供专业的职业培训资讯知识

Postgres:展平JSON(b)数据

数据

开发人员喜欢使用 JSON,当他们存储数据时,通常不会对其进行规范化。 因此,在数据库中遇到 JSON(b) 字段并不罕见。 对于数据分析师、数据科学家和机器学习工程师来说,取消嵌套或扁平化,数据往往是后续分析的先决条件。

整理数据库中的 JSON 列可能具有挑战性。 通常目标是将 JSON 数组扩展到新行并将 JSON 对象取消嵌套到新列中。 幸运的是,Postgres 有几个内置函数,可以组合这些函数来处理数据库中复杂 JSON 的规范化。

Postgres:展平JSON(b)数据

推荐:用 NSDT设计器 快速搭建可编程3D场景。

1、数据集

下表说明了一个常见的场景,其中一个表(我们将其称为城市)包含一个 JSON 或 JSON(b) 列(即坐标)。

+---+-------------------+-------+---------------------------------+
|idx|name               |country|coordinates                      |
+---+-------------------+-------+---------------------------------+
|1  |Sant Julià de Lòria|AD     |{"lat": 42.46372, "lng": 1.49129}|
|2  |Pas de la Casa     |AD     |{"lat": 42.54277, "lng": 1.73361}|
|3  |Ordino             |AD     |{"lat": 42.55623, "lng": 1.53319}|
|4  |les Escaldes       |AD     |{"lat": 42.50729, "lng": 1.53414}|
|5  |la Massana         |AD     |{"lat": 42.54499, "lng": 1.51483}|
|6  |Encamp             |AD     |{"lat": 42.53474, "lng": 1.58014}|
+---+-------------------+-------+---------------------------------+

虽然数据存储为 JSON 对象,但数据分析师、数据科学家或 ML 工程师更喜欢将 lat 和 lng 规范化为列。 幸运的是,我们可以使用 Postgres 内置的 jsonb_to_record 函数来构造 JSON 对象。

2、使用 jsonb_to_record 展平 JSON 对象

如果相关列包含 JSON(b) 对象,你可以使用内置函数 jsonb_to_record(或 json_to_record)将键值对规范化为列。 该函数接受一个 JSON 对象或包含 JSON 对象的列,并返回一条记录。 通过在 AS 表达式中匹配用户提供的复合类型来扩展记录。 复合类型表达式只是 JSON 对象键名(区分大小写)和用于它的 Postgres 数据类型。 JSON 对象可以包含比您在复合类型中定义的更多的键值对,它们将被排除。 如果复合类型定义了 JSON 对象中缺少的键,则它的值为 null。

Postgres 文档显示了如何在给定 JSON 对象的情况下使用 json_to_record:

SELECT *
FROM json_to_record("{"a":1,"b":[1,2,3],"c":"bar"}") AS
  x(a int, b text, d text)
 a |    b    | d
---+---------+---
 1 | [1,2,3] |

在此示例中,该函数接收一个 JSON 对象 {"a":1,"b":[1,2,3],"c":"bar"}。 用户定义的复合类型 x 定义键 a、b 和 d 的映射。 因为 JSON 对象包含键 a 和 b,并且数据类型与复合类型中的数据类型匹配,所以它们被提取为记录的一部分。 复合类型没有为 c 定义映射,所以它不是从对象中提取的。 此外,复合类型定义了对象中缺少的 d,因此未被提取。

文档中的示例很好,但通常我们希望在表列而不是字符串中取消嵌套 JSON。 幸运的是,我们可以在包含 JSON 对象的列上使用相同的 json_to_record 和 jsonb_to_record 函数。

以上面的城市表为例,我们可以将坐标列中的 JSON 对象展平。

SELECT
  city.idx,
  city."name",
  city.country,
  coord.lat,
  coord.lng
FROM
  city,
  jsonb_to_record(coordinates) AS coord(lat numeric, lng numeric);
+---+-------------------+-------+--------+-------+
|idx|name               |country|lat     |lng    |
+---+-------------------+-------+--------+-------+
|1  |Sant Julià de Lòria|AD     |42.46372|1.49129|
|2  |Pas de la Casa     |AD     |42.54277|1.73361|
|3  |Ordino             |AD     |42.55623|1.53319|
|4  |les Escaldes       |AD     |42.50729|1.53414|
|5  |la Massana         |AD     |42.54499|1.51483|
|6  |Encamp             |AD     |42.53474|1.58014|
+---+-------------------+-------+--------+-------+

在此示例中,我们在坐标列上使用 jsonb_to_record 将对象展平为两列。 复合类型坐标匹配对象键和数据类型。 然后,我们可以在 SELECT 语句中引用与复合类型匹配的记录,以将 lat 和 lng 作为单独的列返回。

3、使用 jsonb_to_recordset 取消嵌套 JSON 数组

如果你的数据是 JSON 数组而不是 JSON 对象,则不能使用 jsonb_to_record 对其进行规范化。 相反,您想使用相关函数 jsonb_to_recordset。

内置函数 json_to_recordset 和 jsonb_to_recordset 与对应的 json_to_record 和 jsonb_to_record 非常相似。 不同之处在于 *_to_recordset 函数对 JSON 数组而不是 JSON 对象进行操作。

为了说明这一点,请考虑下表(称为国家/地区)。 该表与上面的城市表类似,只是每个城市一行,每个国家一行。 cities 列包含一个 JSON 数组,其中每个条目都是一个城市,存储为 JSON 对象。

+---+------------+---------------------------------------------------------------+
|idx|country_name|cities                                                         |
+---+------------+---------------------------------------------------------------+
|1  |AU          |[{"name": "York", "coordinates": {"lat": -31.88809, "lng": 1...|
|2  |AT          |[{"name": "Neu-Guntramsdorf", "coordinates": {"lat": 48.0642...|
|3  |AR          |[{"name": "Zárate", "coordinates": {"lat": -34.09814, "lng":...|
|4  |AG          |[{"name": "Saint John’s", "coordinates": {"lat": 17.12096, "...|
|5  |AO          |[{"name": "Saurimo", "coordinates": {"lat": -9.66078, "lng":...|
|6  |AQ          |[{"name": "McMurdo Station", "coordinates": {"lat": -77.846,...|
+---+------------+---------------------------------------------------------------+

在 cities 列上使用 jsonb_to_recordset 函数,我们可以将 JSON 数组扩展为单独的行。 和以前一样,我们提供了一个包含键名和数据类型的复合类型。

SELECT
  idx,
  country_name,
  city.name,
  city.coordinates
FROM country,
     jsonb_to_recordset(cities) AS city(name text, coordinates jsonb);
+---+------------+---------+------------------------------------+
|idx|country_name|name     |coordinates                         |
+---+------------+---------+------------------------------------+
|1  |AU          |York     |{"lat": -31.88809, "lng": 116.7678} |
|1  |AU          |Yanchep  |{"lat": -31.54678, "lng": 115.63171}|
|1  |AU          |Yallingup|{"lat": -33.64592, "lng": 115.03514}|
|1  |AU          |Wundowie |{"lat": -31.76163, "lng": 116.3799} |
|1  |AU          |Wooroloo |{"lat": -31.8038, "lng": 116.31311} |
|1  |AU          |Woodville|{"lat": -34.88333, "lng": 138.55}   |
+---+------------+---------+------------------------------------+

请注意每个城市的 idx 值(国家/地区索引列)重复。

4、展平嵌套的 JSON

在前面的示例中,复合类型使用 jsonb 类型作为坐标键。 因此,查询将坐标作为 JSONB 列返回。 鉴于我们的目标是扁平化 JSON 数据,我们可以在之前的查询的基础上构建以返回单独的 lat 和 lng 列。

SELECT
  idx,
  country_name,
  city.name,
  coord.lat,
  coord.lng
FROM country,
     jsonb_to_recordset(cities) AS city(name text, coordinates jsonb),
     jsonb_to_record(coordinates) AS coord(lat numeric, lng numeric);
+---+------------+---------+---------+---------+
|idx|country_name|name     |lat      |lng      |
+---+------------+---------+---------+---------+
|1  |AU          |York     |-31.88809|116.7678 |
|1  |AU          |Yanchep  |-31.54678|115.63171|
|1  |AU          |Yallingup|-33.64592|115.03514|
|1  |AU          |Wundowie |-31.76163|116.3799 |
|1  |AU          |Wooroloo |-31.8038 |116.31311|
|1  |AU          |Woodville|-34.88333|138.55   |
+---+------------+---------+---------+---------+

同时使用 jsonb_to_recordset 和 jsonb_to_record,我们能够展平 JSON 数据,以便每个城市有一行,重复国家数据。

5、结束语

在数据库中争论 JSON 的数据分析师、数据科学家和 ML 工程师可以使用 Postgres 的内置函数来规范化数据。 通过将这些函数组合在一起,可以将复杂的 JSON 扩展为新的行和列,以便它们可以在下游用于数据探索、数据分析和构建模型。

原文链接:http://www.bimant.com/blog/flattening-json-b-in-postgres/

相关内容

@陕西学生家长:请使用“校外培训家长端”APP保障合法权益

来源:西安市教育局 来源:陕西省教育厅校外教育培训监管处(民办教育处) ···

澳门帮扶贵州从江小学英语教师能力提升培训学习热度高

连日来,在贵州师范大学举办的2021年澳门帮扶贵州省从江县小学英语教师能力提升培训课堂上,授课老师与培训学员积极互动,各小组各显神通,都拿出自己精心设计的教学作品尽情展示,呈现出一片热闹景象。图为参培学员在澳门帮扶从江县小学英语教师能力提升···

中俄中学联盟首届全国中学俄语教师培训在黑龙江举行

中新网哈尔滨8月21日电(王庆利 记者 刘锡菊)“中俄中学联盟·首届中国中学俄语教师培训”21日在中国北疆黑龙江省启幕,来自上海、黑龙江、广东等省份的60余名中国教师参与活动,在接来下的4天时间里,成员们将在语言技法、文化背景及师者内涵等方···

聚焦新课程 实践新理念——娄星区2023年小学英语新课标培训

科教新报·新湖南客户端讯(通讯员 梁彩桃)为更好地领会和贯彻《义务教育英语课程标准》(2022年版),并切实把新课标的教育理念和基本要求落实到课堂中,落实立德树人的根本任务,提升英语教师的专业能力和核心素养,9月20日上午,娄底市娄星区20···

内地人在香港讲普通话会受歧视?真相远没那么简单

一个长期存在的梗,因为内地与香港通关,再次被炒了起来:日前,有个内地自媒体女孩做了期“挑战在香港一天只说普通话”视频,得出结论是不仅会被歧视遭翻白眼,还会受到与当地人不同等的待遇。真相是这样的吗,或者说,真相就这么简单粗暴吗?愿讲还是不会讲···

靠谱的成都托福培训机构怎么选?

托福全称是检定非英语为母语的英语能力考试,是由美国教育测验服务社举办的英语能力测验。一般提升托福的方法有两种:自学或报班,但很多同学都会选择报班。那么靠谱的成都托福培训机构怎么选? 一起来看看吧。1、多对比。想选择合适的托福机构,一定不能怕···

香港将定期举行中小学普通话水平考试

香港考试及评核局5月26日宣布,今年5月起会定期协办中小学普通话水平考试,为香港中小学生提供更多认证普通话能力的选择。这个获国家教育部港澳台事务办公室批准举办的普通话水平考试,2006年第一次在香港举办,至今报考人数超过10万人次。负责主办···

香港小学普通话水平测试今天首度开考!114考生报名参加

香港语言研究中心率先推出香港小学普通话水平等级测试。 (新华社资料图)【点新闻报道】由香港语言研究中心组织研发的标准化专业考试“香港幼稚园及中小学普通话水平等级测试”之HKPSC-P(香港小学普通话水平等级测试)于今日(17日)首度在香港考···

工行湖南分行举办全省EAP员工关怀课程培训班

为进一步提升全行员工幸福感和获得感,促进员工心理健康,为员工减负减压,8月31日下午,工商银行湖南省分行以现场加视频会议形式在长沙举办了一期全省EAP员工关怀课程培训班。省分行本部的员工在现场,全省14个地市分行的200余名一线员工通过视频···

香港电脑学会IT领袖培训平台iLEAP参访新华三杭州总部

9月4日,香港电脑学会IT领袖培训平台iLEAP一行到访紫光股份旗下新华三集团杭州总部,进行深入地交流学习。在新华三集团副总裁,首席品牌营销官杨玺和新华三港澳区总经理于飞的陪同下,他们先后抵达新华三杭州创新体验中心及新华三未来工厂,体验了新···

赴港升学必备——粤语培训班来袭!|精通粤语,横行香港

要想真正了解香港,更好地在香港学习和生活,听得懂并且能说基本的粤语是大有裨益的。赴港必备——粤语培训班来袭!! 赴港升学——粤语语言的重要性特殊的历史背景,造就了香港独特的语言环境。一般香港人日常交流以粤语为主,学好粤语不仅能够帮助各位同学···

贵州省民族地区、农村地区教师普通话培训班在贵州民族大学举行

来源:【未来网】6月21日上午,由贵州省教育厅(省语委)、贵州民族大学“国家语言文字推广基地”共同举办的贵州省民族地区、农村地区教师普通话培训班开班仪式在贵州民族大学举行。参加本次培训班的学员共100名,分别来自铜仁市、遵义市和安顺市边远民···

备战亚运 浙江金华铁路部门加强外语等相关培训

杭州亚运会将于9月23日至10月8日举行。浙江金华是本届亚运会协办城市之一,将承办足球和藤球两个项目,近期,铁路金华车务段在辖区内开展外语等相关方面的培训,提升服务能力。在义乌高铁站多功能厅里,也门留学生王迪正在为车站工作人员培训阿拉伯语,···

港人英语能力亚洲排第四?香港教育局:公众须小心解读有关数字及排名

来源:环球时报【环球时报综合报道】私人英语教育机构英孚教育(EF)发表最新一份《EF EPI英语能力指标》,调查覆盖112个国家和地区,分析约200万名非英语母语人士在英语阅读和聆听测试方面的数据,结果香港在亚洲排名第四。资料图 图源:视觉···

香港教育局局长访京:将安排教师到北师大培训,鼓励学好普通话

北京日报客户端 | 记者 孟紫薇香港特区行政长官李家超本周在北京拜访不同中央部委和机构,多位特区政府政策局局长也来京访问。教育局局长蔡若莲昨天(3月15日)先后到访教育部语言文字应用研究所(下称“语用所”)、北京师范大学等,共商香港新入职教···

齐鲁师范学院承办的山东省2023年小学英语骨干教师培训圆满结束

9月14日—17日,由齐鲁师范学院外国语学院承办的山东省2023年小学英语骨干教师培训在济南举行。全省各地教育局遴选的51名小学英语骨干教师参加此次培训。齐鲁师范学院外国语学院院长、项目负责人宋秀葵,项目首席专家、外国语学院教授梁承锋及学院···

香港小学普通话水平考级,开考

参考消息网6月20日报道据香港“橙新闻”网站6月19日报道,由香港语言研究中心组织研发的“香港小学普通话水平等级测试”,17日首度在香港考试及评核局进行,测试地点位于考评局新蒲岗评核中心。据报道,此次测试共有来自全港30所小学的114名小一···

早安海峡 蔡英文南太“寻亲”遭嘲讽 南非警察汉语学习班受欢迎

台海时事部魅力中国,早安海峡!各位早上好,今天是10月19日,星期四,迎收听中国台湾网《早安,海峡》。首先来关注新闻头条【头条】习近平强调,坚持“一国两制”,推进祖国统一(图片来源:中国台湾网)习近平同志在十九大报告中强调,坚持“一国两制”···

全球首批!GE Apex CT培训基地落户江西省人民医院

2023年6月10日下午江西省人民医院(南昌医学院第一附属医院)GE Apex CT培训基地授牌仪式在江西省人民医院爱国路院区裙楼举行,陈志平院长出席并代表医院接受授牌。GE公司256排512层Revolution Apex CT,这是江西···

云南省中药材新版GAP培训班在昆举办

来源:【云南日报】为进一步落实《云南省中药材产业高质量发展三年行动工作方案(2022-2024年)》,8月21日,由云南省农业农村厅、云南省农业科学院药用植物研究所联合举办的中药材新版GAP培训班在昆明举办。全省14个州市的中药材推广技术人···