数据库
从原始数据到清理数据库:深入挖掘通用数据工具包
使用多功能数据套件的完整示例(最近由VMware发布的框架)和Trino DB
最近,VMware发布了一个新的开源工具,称为多功能数据套件(简称VDK),它允许非常快速地管理数据。该工具允许通过很少的代码行将不同格式的数据输入到单个数据库中。
在我的前一篇文章,我描述了一个基本的例子,它使用VDK,并描述了如何安装它并使它运行。总之,你应该:
- 有一个正在运行的数据库(VDK外部)
- 在VDK中配置到数据库的接口,包括用户名、密码、主机和端口
- 在VDK中定义如何摄取数据库中的数据,使用SQL查询或Python实现的更复杂的过程。
在数据库中摄取数据后,您可以根据需要使用它们,例如,构建有趣的仪表板或可视化。
在这种基于“增大化现实”技术T.在本文中,我将重点介绍一个完整的例子,它从数据摄取开始,一直到数据处理。这个例子使用了一个带MySQL服务器的Trino数据库来存储数据,VDK在数据库中吸收数据。
下图显示了可能的架构,包括VDK,Trign服务器和MySQL Server:
详细说明,该文章如下所组织:
- 场景定义
- 数据库的设置
- VDK中的数据摄取
- VDK中的数据处理
1场景定义
该情景的目的是分析美国不同地区的预期寿命,并将其与该地区的国内生产总值(GDP)进行比较。为了实现这一目标,您应该下载与美国预期寿命相关的数据,并将它们与相关的GDP合并。
这个示例展示了如何通过VDK提取和集成该场景所需的数据。
我们可以使用以下两个数据集,两者都可以作为CSV文件可用:
以前的数据集在下面发布美国政府工作执照。
除了前面的数据集,我们还可以使用下面的其他数据集:
前两位数据集分别由美国经济分析局和美国人口普查局发布,两者都在公共许可下提供开放数据。
数据集2010-2015年,美国各州出生时预期寿命和人口普查数据包含了73,121份美国人预期寿命的记录,按州和县划分,涉及到2010-2015年期间。
下图显示了数据集的摘录:
DataSet U.S.状态预期寿命因性行为,2018年包含与2018年美国人预期寿命有关的156条记录,除以州和性别(男性,女性,总数)。下图显示了数据集的摘录:
DataSet美国国内生产总值由县含有3,163条记录,与美国真正的国内生产总值有关,县,指2017-2020岁的时间。数据集包含许多列。下图显示了数据集的摘录:
DataSet美国国内生产总值由县含有3,163条记录,与美国真正的国内生产总值有关,县,指2017-2020岁的时间。数据集包含许多列。下图显示了数据集的摘录:
2安装数据库
我们将所有的数据存储在一个Trino数据库作为一个MySQL服务器的接口。Trino.是一个用于大数据分析的分布式开源SQL查询引擎。它运行分布式和并行查询,速度非常快。对于Trino数据库的设置,您可以按照以下步骤进行我之前的教程.
在此示例中,Trinin在本地运行,以下最小值config.properties
配置文件:
协调员= true
node-scheduler.include-coordinator = true
http-server.http.port = 8080
query.max-memory = 5GB
query.max-memory-per-node = 1gb
query.max-总内存 - 每节点= 2GB
discovery.uri = http://127.0.0.1:8080
http-server.https.enabled = false
此外,Trino DB使用MySQL目录,配置如下(文件mysql.properties
位于Trino服务器的目录文件夹中:
connector.name = mysql.
连接url = jdbc: mysql: / / localhost: 3306
连接用户=根
连接密码=
allow-drop-table = true
最后,这个示例假设调用一个空模式人均预期寿命
存在于MySQL Server上。
3 VDK数据吸收
VDK使用以下配置运行(config.ini.
):
db_default_type = TRINO
ingest_method_default = trino
trino_catalog = mysql
trino_use_ssl =
trino_host = localhost
trino_port = 8080
trino_user = root
trino_schema =寿命
trino_ssl_verify =.
Data Ingestion将数据源部分中定义的两个CSV表上载到数据库中。对于每一个表,数据的摄取将通过以下步骤进行:
- 删除现有表(如果有的话)
- 创建一个新表
- 直接从CSV文件中摄取表值。
前两个步骤将使用SQL语言编写,而最后一个步骤将使用Python编写。
每个数据集将在表中摄取,名称类似于数据集名称。例如2010-2015年,美国各州出生时预期寿命和人口普查数据数据集将被摄入life_expectancy_2010_2015
表格
3.1删除现有表
首先,我创建了一个名为01 _delete_table_life_expectancy_2010_2015.sql
:
删除表(如果存在)life_expectancy_2010_2015
数量01.
脚本名称前面表示VDK框架将作为第一个脚本运行。
我也创造了02 _delete_table_life_expectancy_2018.sql
脚本,该脚本删除Life_expectancy_2018
表和其他脚本删除US_REGIONS
和US_GDP.
表。
3.2创建新表
现在,我为新表创建了架构,我将其存储在03 _create_table_life_expectancy_2010_2015.sql
脚本:
创建表life_expectancy_2010_2015(
状态varchar(32),
瓦尔(32),
CensusTractNumber varchar (32),
LifeExpectancy小数(4,2),
LifeExceldancyRange Varchar,
LifeExpectancyStandardError小数(4,2)
的)
类似于上一个脚本,我创建了04 _create_table_life_expectancy_2018.sql
:
创建表life_expectancy_2018 (
状态varchar(32),
性varchar (32),
勒布十进制(3,1),
Se Decimal(3,1),
四分位数varchar (32)
的)
还有US_REGIONS
和US_GDP.
表:
创建表us_regions (
状态varchar(32),
StateCode varchar (2),
varchar(32),
varchar (32)
的)创建表US_GDP(
瓦尔(32),
Year2017长整型数字,
Year2018长整型数字,
年2019年大火,
年2020年大火
的)
3.2直接从CSV文件中摄取表值
最后,我可以进入表格值life_expectancy_2010_2015
表格我使用了IJobInpul.
VDK API提供的类。我定义A.跑()
函数,它将被VDK框架读取,在它里面,我写摄取代码:
进口熊猫作为PD
从vdk.api。job_input进口IJobInputdef跑(job_input: IJobInput):#读取CSV文件url = " http://data.cdc.gov/api/views/5h56-n989/rows.csv "
dtypes = {
“状态”:str,
“县”:str,
"Census Tract Number": str,
“寿命”:np.float64,
“预期寿命范围”:str,
"Life Expectancy Standard Error": n .float64,
}df = pd。dtype = dtypes read_csv (url)。取代 ("'", "''", regex = True)
df.columns = df.columns.str.Replace(“”,“”)#INCEST CSV文件job_input。send_tabular_data_for_ingestion.(
df.itertuls(index = false),
destination_table =“life_expectancy_2010_2015”,
column_names = df.columns.Tolist()
的)
为了摄取数据库中CSV的每一行,我使用send_tabular_data_for_ingestion()
的方法IJobInpul.
班级。
我们可以用同样的技术吸收其他数据集。
4 VDK中的数据处理
数据处理包括以下任务:
- 干净的桌子
- 合并清理过的桌子
4.1清洁桌子
清洁life_expectancy_2010_2015
表中包含以下两项操作:
- 县分组记录
- 拆分的列
LifeExpectancyRange
在两个小数列中MinLifeExpectancyRange
和MaxLifeExpectancyRange
.
清洗过程的输出为life_expectancy_2010_2015
表存储在一个新表中,称为cleaned_life_expancy_2010_2015
.
以上两种操作都可以通过SQL语句来实现:
创建表cleaned_life_expancy_2010_2015作为(选择状态,
LifeExpectancy,
cast(split(life_expectancy_2010_2015.LifeExpectancyRange,'-')[1] AS decimal(4,2)) AS MinLifeExpectancyRange,
cast(split_expectancy_2010_2015.lifeexcienctancyrange,' - ')[2]作为十进制(4,2))作为maxlifeexcipyrangange,
LifeExpectancyStandardError
从life_expectancy_2010_2015
在哪里县='(空白)'
的)
在数据集中,具有县='(空白)'
包含给定县的预期寿命的总和。因此,只需选择这些行,我就可以轻松地按县进行分组。
下图显示了结果表:
现在,我打扫Life_expectancy_2018
表格清洁Life_expectancy_2018
表中包含以下操作:
- 重命名列
1
到预期寿命
- 重命名列
se
到LifeExpectancyStandardError
- 拆分的列
四分位数
在两个小数列中MinLifeExpectancyRange
和MaxLifeExpectancyRange
- 只选择包含以下内容的行
性别=“总”
.
以上所有操作都可以通过一条SQL语句来实现:
创建表cleaned_life_expectancy_2018作为(选择状态,
LEB作为生命临界,
(分裂(life_expectancy_2018。四分位数那' - ')[1] AS decimal(4,2)) AS MinLifeExpectancyRange,
cast(splind(life_expectancy_2018.quartile,' - ')[2]作为十进制(4,2))作为maxlifeexcipancangange,
SE是LifeExpectancyStandardError从Life_expectancy_2018
在哪里性别= 'Total' and State <> 'United States'
的)
的示例Cleaned_life_expectancy_2018
表:
注意,清洗完毕后cleaned_life_expancy_2010_2015
和Cleaned_life_expectancy_2018
表具有相同的模式。
4.2合并清理后的表
最后,我准备合并所有的表。我执行以下操作:
- 垂直合并之间的
cleaned_life_expancy_2010_2015
和Cleaned_life_expectancy_2018
表; - 横向合并在结果表之间和
US_REGIONS
和US_GDP.
表。
垂直合并意味着第二个数据集附加到第一个数据集,而水平合并添加了三列,调用期
那国内生产总值
和地区
,结果表,它被命名merged_life_expectancy
.的国内生产总值
属性仅为记录设置期限='2018'
.对于其他记录,它将设置为0.
,因为它不可用。
创建表merged_life_expectancy作为(选择us_regions.state,
LifeExpectancy,
MinLifeExpectancyRange,
MaxLifeExpectancyRange,
“2010 - 2015”时期,
地区,
0作为GDP.
从cleaned_life_expancy_2010_2015
加入US_REGIONS
在us_regions.state = cleaned_life_expancy_2010_2015.state
的)联盟(选择us_regions.state,
LifeExpectancy,
MinLifeExpectancyRange,
MaxLifeExpectancyRange,
“2018”时期,
地区,
Year2018作为国内生产总值
从Cleaned_life_expectancy_2018
加入US_REGIONS
us_regions。状态= cleaned_life_expectancy_2018.State
内部加入US_GDP.
在us_gdp.county = cleaned_life_expancy_2018.state
在哪里Year2018 > 100000000
的)
在第二个选择
声明中在哪里
指定条件Year2018 > 100000000
.这只允许选择县。
最终表如下表所示:
总结
恭喜你!您刚刚学习了如何在VDK中摄取和处理数据!这可以通过用SQL和Python编写简单的脚本来实现。
此示例的完整代码可用在这里.
下一步是构建一个显示处理结果的报告。敬请关注,学习如何去做:)
对于多功能数据套件的问题或疑问,您可以直接加入他们的公共松弛工作区或他们的邮件列表或在推特上关注他们.
如果你已经读过这一点,对于我来说,今天已经很多了。谢谢!您可以阅读更多关于我的信息这篇文章.