通過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()