通过DataWorks Notebook利用SQL、Python和Markdown Cell对“中国大陆专利申请和授权数据集”进行数据开发、分析和展示,本文为您介绍具体的操作流程。
背景信息
本实践将基于公开数据集“中国大陆专利申请和授权数据集”,在DataWorks Notebook中使用EMR Spark SQL、Hologres SQL、EMR StarRocks SQL、MaxCompute SQL、Python和Markdown Cell来完成数据开发、分析和展示。公开数据集“中国大陆专利申请和授权数据集”存储在OSS中,包含了2003年至2021年间,中国大陆各省份的三大类专利申请和授权数据。基于该数据集,可以通过省份、年份来查询和探索各地区的发明专利、实用新型专利和外观设计专利的申请情况和授权数量。
前提条件
已创建DLF 2.0数据目录。如未创建,详情请参见创建数据目录。
说明如果是RAM用户,在进行数据操作之前,需要先授予相应的资源权限。详情请参见授权管理。
已创建Serverless StarRocks实例,实例版本需要不低于3.2。如未创建,详情请参见创建实例。
已创建EMR Serverless Spark工作空间,引擎版本需要选择esr-2.3 (Spark 3.4.2, Scala 2.12)。
已创建Hologres实例,实例版本需要不低于3.0.7。
已开通MaxCompute外部项目。
已创建DataWorks工作空间,并绑定Serverless Spark工作空间、Serverless StarRocks实例、Hologres实例和MaxCompute外部项目的计算资源。
操作流程
前置步骤:载入Notebook案例
找到对应的案例卡片(OpenLake解决方案快速入门),单击卡片中的载入案例。
选择载入到的工作空间和实例,单击确认,进入DataWorks数据开发页面。
步骤1:环境准备
设置DataLakeFormation(DLF)相关的全局参数,便于在后续运行代码时直接引用。
连接DLF服务所需的全局参数
# 请在下方填写全局参数1-4的值,再运行代码 # 1)请将 [dlf_region] 替换为您的DLF所在区域ID,例如cn-beijing dlf_region = "[dlf_region]" # 2)请将 [dlf_catalog_id] 替换为您DLF数据目录ID;如果已进行OpenLake一体化开通,推荐填写:"openlake_demo_dlf" 对应的DLF数据目录ID dlf_catalog_id = "[dlf_catalog_id]" # 3)请将 [dlf_catalog_accessKeyId] 替换为您访问DLF服务所需的AccessKeyId dlf_catalog_accessKeyId = "[dlf_catalog_accessKeyId]" # 4)请将 [dlf_catalog_accessKeySecret] 替换为您访问DLF服务所需的AccessKeySecret dlf_catalog_accessKeySecret = "[dlf_catalog_accessKeySecret]" # DLF服务的VPC网络Endpoint 和 Hologres访问DLF的Endpoint,格式已适配,以下配置无需修改 dlf_endpoint = f"dlfnext-vpc.{dlf_region}.aliyuncs.com" dlf_endpoint_for_holo = f"dlfnext-share.{dlf_region}.aliyuncs.com"
配置项
描述
dlf_region
DLF所在区域ID,例如cn-hangzhou、cn-beijing等,详情请参见地域及访问域名。
dlf_catalog_id
DLF数据目录ID,请在数据湖构建控制台上查看数据目录对应的ID,详情请参见数据目录。
dlf_catalog_accessKeyId
访问DLF服务所需的Access Key ID,获取方法请参见查看RAM用户的AccessKey信息。
dlf_catalog_accessKeySecret
访问DLF服务所需的Access Key Secret,获取方法请参见查看RAM用户的AccessKey信息。
使用DLF数据目录、数据库和数据表所需的全局参数
# 请在下方填写全局参数1-4的值,再运行代码设置DataLakeFormation(DLF)相关的全局参数,便于在后续运行代码时直接引用。 # 1)请将[dlf_catalog_name]替换为您的目标DLF Catalog名称。如果已进行OpenLake一体化开通,推荐填写:"MyFirstCatalog"。 dlf_catalog_name = "[dlf_catalog_name]" # 2)请将[dlf_database_name]替换为您的目标DLF数据库名称。如果已进行OpenLake一体化开通,推荐填写:"default"。 dlf_database_name = "[dlf_database_name]" # 3)请将[dlf_table_name]替换成自定义表名称,推荐填写:"mainland_domestic_patents_application" dlf_table_name = "[dlf_table_name]" # 4)请将[dlf_catalog_name_for_mc]替换为MC外部项目名称。如果已进行OpenLake一体化开通,推荐填写:"openlake_demo_mc_expj_随机字符" dlf_catalog_name_for_mc = "[dlf_catalog_name_for_mc]"
配置项
描述
dlf_catalog_name
DLF数据目录名称,请在数据湖构建控制台上查看数据目录名称,详情请参见数据目录。
dlf_database_name
DLF数据库名称,请在数据湖构建控制台上查看数据目录下的数据库名称,详情请参见数据库。
dlf_table_name
自定义表名称。
dlf_catalog_name_for_mc
MaxCompute外部项目名称,具体信息请参见MaxCompute控制台。
步骤2:数据准备
从OSS公开存储地址中获取原始数据,并存入Python Pandas DataFrame中(DataFrame对象的变量名称:df_data)。
读取OSS原始数据。
import pandas as pd df_data = pd.read_csv('https://dataworks-dataset-cn-shanghai.oss-cn-shanghai.aliyuncs.com/public-datasets/L1_update/L2_mainland_domestic_patents_application/full_title_03_21_mainland_domestic_patents_application.txt', sep=',', header=0) df_data
创建Paimon格式的数据表。
import os import pandas as pd import pyarrow as pa from paimon_python_java import Catalog from paimon_python_api import Schema # 连接DLF Catalog catalog_options = { 'metastore': 'dlf-paimon', 'dlf.endpoint': dlf_endpoint, 'dlf.region': dlf_region , 'dlf.catalog.id': dlf_catalog_id, 'dlf.catalog.accessKeyId': dlf_catalog_accessKeyId , 'dlf.catalog.accessKeySecret': dlf_catalog_accessKeySecret, } catalog = Catalog.create(catalog_options) # 新建Paimon表 record_batch = pa.RecordBatch.from_pandas(df_data) schema = Schema(record_batch.schema) catalog.create_table(f'{dlf_database_name}.{dlf_table_name}', schema, True)
数据写入Paimon表。
将之前步骤中获取的Python Pandas DataFrame对象(df_data)的数据写入Paimon表(表名为步骤1中定义的dlf_table_name参数取值)。
# 将数据写入表 table = catalog.get_table(f'{dlf_database_name}.{dlf_table_name}') write_builder = table.new_batch_write_builder() table_write = write_builder.new_write() table_commit = write_builder.new_commit() record_batch = pa.RecordBatch.from_pandas(df_data) table_write.write_arrow_batch(record_batch) commit_messages = table_write.prepare_commit() table_commit.commit(commit_messages) table_write.close() table_commit.close() print("成功写入数据到Paimon表!")
步骤3:交互式分析
使用Python构建ipywidgets交互组件。
import ipywidgets as widgets from IPython.display import display # 中国的所有省份、自治区和直辖市 provinces = [ '北京市', '天津市', '上海市', '重庆市', '河北省', '山西省', '辽宁省', '吉林省', '黑龙江省', '江苏省', '浙江省', '安徽省', '福建省', '江西省', '山东省', '河南省', '湖北省', '湖南省', '广东省', '广西壮族自治区', '海南省', '四川省', '贵州省', '云南省', '西藏自治区', '陕西省', '甘肃省', '青海省', '宁夏回族自治区', '新疆维吾尔自治区' ] # 创建复选框组件 checkboxes = [widgets.Checkbox(description=province) for province in provinces] # 将复选框按5列排列 checkbox_grid = widgets.GridBox(checkboxes, layout=widgets.Layout(grid_template_columns="repeat(5, 200px)")) print("选择要查询的省市地区:") # 显示复选框组件 display(checkbox_grid) # 定义处理复选框变化的函数 def handle_checkbox_change(change): global query_province selected_provinces = [checkbox.description for checkbox in checkboxes if checkbox.value] query_province = "'" + "','".join(selected_provinces) + "'" # 绑定复选框变化事件 for checkbox in checkboxes: checkbox.observe(handle_checkbox_change, names='value')
使用SQL查询2021年不同省市地区的专利获批率。
EMR Spark SQL
Cell类型选择EMR SPARK SQL,并选择已绑定的Serverless Spark计算资源,请注意Spark工作空间中的数据目录是否已经添加了步骤1中"dlf_catalog_name"变量对应的DLF数据目录。
SELECT ROUND(designs_patents_granted/patents_application_granted*100,2) AS designs_patents_granted_rate, -- 专利申请获得授权的百分比 region, -- 地区 year -- 年份,枚举值从2003至2021 FROM ${dlf_catalog_name}.${dlf_database_name}.${dlf_table_name} WHERE year = '2021' AND region IN ('北京市', '山西省', '浙江省', '河南省', '海南省', '陕西省') ;
Hologres SQL
Cell类型选择Hologres SQL,并选择已绑定的Hologres计算资源。
SELECT (designs_patents_granted::float4/patents_application_granted *100)::decimal(19,2) AS designs_patents_granted_rate, -- 专利申请获得授权的百分比 region, -- 地区 year -- 年份,枚举值从2003至2021 FROM ${dlf_catalog_name}.${dlf_database_name}.${dlf_table_name} WHERE year = '2021' AND region IN ('北京市', '山西省', '浙江省', '河南省', '海南省', '陕西省') ;
EMR StarRocks SQL
Cell类型选择StarRocks,并选择已绑定的StarRocks计算资源。
-- 请先在EMR StarRocks中创建StarRocks External Catalog,映射至DLF Catalog DROP CATALOG `${dlf_catalog_name}`; CREATE EXTERNAL CATALOG `${dlf_catalog_name}` PROPERTIES ( "type" = "paimon", "paimon.catalog.type" = "dlf-paimon", "dlf.catalog.instance.id" = "${dlf_catalog_id}" );
SELECT ROUND(designs_patents_granted/patents_application_granted*100,2) AS designs_patents_granted_rate, -- 专利申请获得授权的百分比 region, -- 地区 year -- 年份,枚举值从2003至2021 FROM `${dlf_catalog_name}`.`${dlf_database_name}`.${dlf_table_name} WHERE year = '2021' AND region IN ('北京市', '山西省', '浙江省', '河南省', '海南省', '陕西省') ;
MaxCompute SQL
Cell类型选择MaxCompute SQL,并选择已绑定的MaxCompute计算资源,请注意所选MaxCompute外部项目关联的DLF数据目录是否是步骤1中"dlf_catalog_name_for_mc"变量对应的DLF数据目录。
set odps.namespace.schema=true; set odps.sql.allow.namespace.schema=true; SELECT ROUND(designs_patents_granted/patents_application_granted*100,2) AS designs_patents_granted_rate, -- 专利申请获得授权的百分比 region, -- 地区 year -- 年份,枚举值从2003至2021 FROM `${mc_external_prj}`.`${dlf_database_name}`.${dlf_table_name} WHERE year = '2021' AND region IN ('北京市', '山西省', '浙江省', '河南省', '海南省', '陕西省') ;
步骤4:可视化图表
步骤3中的数据查询结果均已经存储至Python Pandas DataFrame对象中,分别是:
EMR Spark SQL查询结果:df_spark
Hologres SQL查询结果:df_hologres
StarRocks SQL查询结果:df_starrocks
MaxCompute SQL查询结果:df_maxcompute
执行以下Python脚本,可视化展示不同省份的外形设计专利占比柱状图。
import pandas as pd
import matplotlib.pyplot as plt
import math
#省份及地区名称
province = list(df_spark['region']) # df_spark 支持替换为:df_spark 或 df_hologres 或 df_starrocks 或 df_maxcompute
province = [prov for prov in province]
#外形设计专利的占比
rate = list(df_spark['designs_patents_granted_rate']) # df_spark 支持替换为:df_spark 或 df_hologres 或 df_starrocks 或 df_maxcompute
rate = [math.floor(float(tmp_rate)) for tmp_rate in rate]
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = 'Source Han Serif SC'
#绘制柱状图
plt.bar(province, rate)
plt.ylim(0, 30)
plt.yticks(range(0, 30, 5))
plt.xlabel('province')
plt.xticks(rotation=45, ha="right")
plt.ylabel('designs_patents_granted_rate')
plt.title('designs_patents_granted_rate')
plt.show()