AnalyticDB for MySQL企業版、基礎版及湖倉版支持通過XIHE SQL和Spark SQL訪問OSS數據。本文以基金交易數據處理為例,介紹通過XIHE SQL和Spark SQL訪問OSS數據的具體步驟。
前提條件
集群的產品系列為企業版、基礎版或湖倉版。
已在AnalyticDB for MySQL集群中創建Job型資源組。具體操作,請參見新建資源組。
已創建AnalyticDB for MySQL集群的數據庫賬號。
如果是通過阿里云賬號訪問,只需創建高權限賬號。具體操作,請參見創建高權限賬號。
如果是通過RAM用戶訪問,需要創建高權限賬號和普通賬號并且將RAM用戶綁定到普通賬號上。具體操作,請參見創建數據庫賬號和綁定或解綁RAM用戶與數據庫賬號。
已授權AnalyticDB for MySQL扮演AliyunADBSparkProcessingDataRole角色來訪問其他云資源。具體操作,請參見賬號授權。
操作步驟
準備數據。
訪問數據。
通過XIHE SQL訪問OSS數據
登錄云原生數據倉庫AnalyticDB MySQL控制臺,在左上角選擇集群所在地域。在左側導航欄,單擊集群列表,在企業版、基礎版或湖倉版頁簽下,單擊目標集群ID。
在左側導航欄,單擊作業開發>SQL開發。
在SQLConsole窗口,選擇Job型資源組和XIHE引擎。
創建數據庫。如果有已創建的數據庫,可以忽略本步驟。示例如下:
CREATE DATABASE adb_demo;
創建OSS外表。
創建交易信息表
CREATE EXTERNAL TABLE tradelist_csv ( t_userid STRING COMMENT '用戶ID', t_dealdate STRING COMMENT '申請時間', t_businflag STRING COMMENT '業務代碼', t_cdate STRING COMMENT '確認日期', t_date STRING COMMENT '申請日期', t_serialno STRING COMMENT'申請序號', t_agencyno STRING COMMENT'銷售商編號', t_netno STRING COMMENT'網點編號', t_fundacco STRING COMMENT'基金賬號', t_tradeacco STRING COMMENT'交易賬號', t_fundcode STRING COMMENT'基金代碼', t_sharetype STRING COMMENT'份額類別', t_confirmbalance DOUBLE COMMENT'確認金額', t_tradefare DOUBLE COMMENT'交易費', t_backfare DOUBLE COMMENT'后收手續費', t_otherfare1 DOUBLE COMMENT'其他費用1', t_remark STRING COMMENT'備注' ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFIlE LOCATION 'oss://<bucketname>/adb/trade/';
語法說明,請參見OSS外表。其中,LOCATION為交易信息表所在的OSS路徑。
創建用戶信息表
CREATE EXTERNAL TABLE userinfo ( u_userid STRING COMMENT '用戶ID', u_accountdate STRING COMMENT '開戶時間', u_gender STRING COMMENT '性別', u_age INT COMMENT '年齡', u_risk_tolerance INT COMMENT '風險承受能力,1-10,10為最高級', u_city STRING COMMENT'所在城市', u_job STRING COMMENT'工作類別, A-K', u_income DOUBLE COMMENT'年收入(萬)' ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFIlE LOCATION 'oss://<bucketname>/adb/user/';
語法說明,請參見OSS外表。其中,LOCATION為用戶信息表所在的OSS路徑。
查詢外表數據。
您可以選擇通過同步執行或異步執行查詢數據,同步執行的結果會直接顯示,異步執行會返回job_id,您可以通過job_id查詢異步任務狀態,判斷任務是否執行成功。
同步查詢
示例一:查詢交易機構SXS_0010,在0603至0604的100條交易記錄。
SELECT * FROM tradelist_csv WHERE t_cdate >= '2018-06-03' and t_cdate <= '2018-06-04' and t_agencyno = 'SXS_0010' limit 100;
返回結果:
+-----------+---------------------+---------------+--------------+--------------+-------------------+--------------+------------+ | t_userid | t_dealdate | t_businflag | t_cdate | t_date | t_serialno | t_agencyno | t_netno | +-----------+---------------------+---------------+--------------+--------------+-------------------+--------------+------------+ | 00041972 | 2018-06-03 09:11:57 | 保本基金B | 2018-06-03 | 2018-06-03 | 2018-06-03-000846 | SXS_0010S | STORE-0135 | +-----------+---------------------+---------------+--------------+--------------+-------------------+--------------+------------+ | 00051912 | 2018-06-03 09:28:20 | 保本基金D | 2018-06-03 | 2018-06-03 | 2018-06-03-001046 | SXS_0010S | STORE-0397 | +-----------+---------------------+---------------+--------------+--------------+-------------------+--------------+------------+ | 00120370 | 2018-06-03 11:21:39 | 保本基金B | 2018-06-03 | 2018-06-03 | 2018-06-03-002393 | SXS_0010S | STORE-0800 | +-----------+---------------------+---------------+--------------+--------------+-------------------+--------------+------------+ | 00165308 | 2018-06-03 12:35:35 | 保本基金D | 2018-06-03 | 2018-06-03 | 2018-06-03-003281 | SXS_0010S | STORE-0340 | +-----------+---------------------+---------------+--------------+--------------+-------------------+--------------+------------+
說明本示例為部分返回結果,實際結果請以控制臺為準。
示例二:查詢各城市、男性女性人群,購買的基金總額(多表Join查詢)。
SELECT u_city, u_gender, SUM(t_confirmbalance) AS sum_balance FROM tradelist_csv , userinfo WHERE u_userid = t_userid GROUP BY u_city, u_gender ORDER BY sum_balance DESC;
返回結果:
+-----------+------------+----------------+ | u_city | u_gender | sum_balance | +-----------+------------+----------------+ | Beijing | male | 2445539161 | +-----------+------------+----------------+ | Guangzhou | male | 1271999857 | +-----------+------------+----------------+ | Qingdao | male | 1266748660 | +-----------+------------+----------------+ | Wuhan | male | 12641688475 | +-----------+------------+----------------+
說明本示例為部分返回結果,實際結果請以控制臺為準。
異步查詢
查詢各城市、男性女性人群,購買的基金總額(多表Join查詢)。
SUBMIT JOB SELECT u_city, u_gender, SUM(t_confirmbalance) AS sum_balance FROM tradelist_csv , userinfo WHERE u_userid = t_userid GROUP BY u_city, u_gender ORDER BY sum_balance DESC;
返回結果:
+---------------------------------------+ | job_id | +---------------------------------------+ | 2023091410365702101701713803151****** | +---------------------------------------+
使用
SUBMIT JOB
提交異步任務后,您可以通過job_id終止異步任務或查詢異步任務狀態,具體操作,請參見異步提交任務。
通過Spark SQL訪問OSS數據
登錄云原生數據倉庫AnalyticDB MySQL控制臺,在左上角選擇集群所在地域。在左側導航欄,單擊集群列表,在企業版、基礎版或湖倉版頁簽下,單擊目標集群ID。
在左側導航欄,單擊作業開發>SQL開發。
在SQLConsole窗口,選擇Job型資源組和Spark引擎。
創建數據庫。如果有已創建的數據庫,可以忽略本步驟。示例如下:
CREATE DATABASE adb_test;
創建OSS外表。
創建交易信息表
CREATE EXTERNAL TABLE adb_test.tradelist_csv ( t_userid STRING COMMENT '用戶ID', t_dealdate STRING COMMENT '申請時間', t_businflag STRING COMMENT '業務代碼', t_cdate STRING COMMENT '確認日期', t_date STRING COMMENT '申請日期', t_serialno STRING COMMENT'申請序號', t_agencyno STRING COMMENT'銷售商編號', t_netno STRING COMMENT'網點編號', t_fundacco STRING COMMENT'基金賬號', t_tradeacco STRING COMMENT'交易賬號', t_fundcode STRING COMMENT'基金代碼', t_sharetype STRING COMMENT'份額類別', t_confirmbalance DOUBLE COMMENT'確認金額', t_tradefare DOUBLE COMMENT'交易費', t_backfare DOUBLE COMMENT'后收手續費', t_otherfare1 DOUBLE COMMENT'其他費用1', t_remark STRING COMMENT'備注' ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFIlE LOCATION 'oss://<bucketname>/adb/trade/';
語法說明,請參見OSS外表。其中,LOCATION為交易信息表所在的OSS路徑。
創建用戶信息表
CREATE EXTERNAL TABLE adb_test.userinfo ( u_userid STRING COMMENT '用戶ID', u_accountdate STRING COMMENT '開戶時間', u_gender STRING COMMENT '性別', u_age INT COMMENT '年齡', u_risk_tolerance INT COMMENT '風險承受能力,1-10,10為最高級', u_city STRING COMMENT'所在城市', u_job STRING COMMENT'工作類別, A-K', u_income DOUBLE COMMENT'年收入(萬)' ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFIlE LOCATION 'oss://<bucketname>/adb/user/';
語法說明,請參見OSS外表。其中,LOCATION為用戶信息表所在的OSS路徑。
查詢數據。
說明執行Spark SQL語句,只返回執行成功或者失敗,不返回查詢結果。您可以在Spark Jar開發頁面應用列表頁簽中的日志查看查詢結果。詳情請參見查看Spark應用信息。
示例一:查詢交易機構SXS_0010,在0603至0604的100條交易記錄。
SELECT * FROM adb_test.tradelist_csv WHERE t_cdate >= '2018-06-03' and t_cdate <= '2018-06-04' and t_agencyno = 'SXS_0010' LIMIT 100;
示例二:查詢各城市、男性女性人群,購買的基金總額(多表Join查詢)。
SELECT u_city, u_gender, SUM(t_confirmbalance) AS sum_balance FROM adb_test.tradelist_csv , adb_test.userinfo WHERE u_userid = t_userid GROUP BY u_city, u_gender ORDER BY sum_balance DESC;