数据流的资源规范化器
dataflows-normalize的Python项目详细描述
数据流资源写入数据库规范化
此库提供一些数据流处理,用于规范化资源。
它特别支持将规范化数据存储到数据库表中。
什么是标准化?
简而言之,这是减少数据集中重复的过程。
更多关于这个概念的信息可以阅读here。
示例
以这个世界城市数据集为例(我们称之为fact资源):
fromdataflowsimportFlow,load,printerFlow(load('https://datahub.io/core/world-cities/r/world-cities.csv',name='cities'),printer(num_rows=1)).process()
城市: |#|名称国家次国家大地水准面 |—————————————————————————————————--- |安道尔埃斯卡尔德酒店 | 2安道尔拉维拉安道尔安道尔拉维拉3041563 |… | 23018{str 1}$chitungwiza{str 1}$津巴布韦{str 1}$harare1106542
似乎country
和subcountry
列是相当重复的—让我们将它们提取到一个单独的、重复数据消除的资源中(我们将称之为dimension资源)。
为此,我们使用normalize
处理器。
这个处理器接收一个资源名和一个NormGroup
实例列表。每个组指定一个新的dimension要提取和消除重复的资源。
让我们看看它的实际效果:
fromdataflows_normalizeimportnormalize,NormGroupFlow(load('https://datahub.io/core/world-cities/r/world-cities.csv',name='cities'),normalize([NormGroup(['country','subcountry'],'country_id','id')],resource='cities'),printer()).process()
城市: |#|名称地理名称ID国家ID |——————————————————————————— | 1 Les Escaldes 3040051 0 | 2安道尔拉维拉3041563 1 | 3 umm al-qaywayn 290594 2 | 4哈伊马角291074 3 | 5 khawr fakk_n 291696 4 |… | 23014布拉瓦约894701 2677 | 23015宾杜拉895061 2678 | 23016北桥895269 2679 | 23017艾普沃斯1085510 2676 | 23018{str 1}$chitungwiza1106542{str 1}$2676
城市/国家标识: |#| ID国家次国家 |————————————————————————————————————————————————— | 1 30阿富汗巴达赫尚 | 2 27阿富汗巴德吉斯 | 3 21阿富汗巴尔赫 |阿富汗 | 5 31阿富汗法拉 | 6 19阿富汗法里亚布 | 7 28阿富汗加兹恩 | 8 13阿富汗高尔 | 9 22阿富汗赫尔曼德 | 10 11阿富汗赫拉特 |… | 2671 2677津巴布韦布拉瓦约 | 2672{str 1}$2676津巴布韦{str 1}$harare | 2673 2673津巴布韦马尼卡兰 | 2674 2678津巴布韦马绍兰中部 | 2675 2675津巴布韦马绍兰东部 | 2676 2674津巴布韦马绍兰西部 | 2677 2670津巴布韦马辛戈 | 2678 2671津巴布韦马塔贝莱兰北部 | 2679 2679津巴布韦马塔贝莱兰南部 | 2680 2672津巴布韦中部地区
如果我们跟随数据集中的最后一行(Chitungwiza
),我们可以看到其区域(Zimbabwe/Harare
)的条目是用id2676
创建的,并且该id被添加到原始行而不是原始值。
我们得到了多少?
原始csv文件的大小为895586字节。
如果我们将这两个新资源保存为csv,我们将得到
对于fact资源,为542299字节;对于区域dimension资源,为68023字节—总共610322字节(或大小减少31%)。
这不仅有助于提高大小,还大大提高了以规范化形式存储数据的数据库性能。
数据库规范化
运行类似代码to以上,仅使用normalize_to_db
将执行以下操作:
-
从数据库中加载现有的值,如表>表>(如果这些表存在)
- 规范化输入数据,并分成fact和dimension资源
用法与normalize
的主要区别在于提供了db表的名称。
fromdataflows_normalizeimportnormalize_to_db,NormGroupFlow(load('https://datahub.io/core/world-cities/r/world-cities.csv',name='cities'),normalize_to_db([NormGroup(['country','subcountry'],'country_id','id',db_table='countries_db_table')],'cities_db_table','cities',db_connection_str='...'),).process()