Spark與DLA SQL引擎以及資料湖構建服務共用中繼資料。
雲原生資料湖分析(DLA)產品已退市,AnalyticDB for MySQL湖倉版支援DLA已有功能,並提供更多的功能和更好的效能。AnalyticDB for MySQL相關使用文檔,請參見Spark SQL開發。
Spark訪問資料湖中繼資料服務
Spark引擎可以支援多種中繼資料服務,既支援訪問使用者自建的Hive,也支援訪問DLA統一管理的資料湖中繼資料。DLA統一管理的資料湖中繼資料管理服務,同時支援多種引擎訪問,實現多種引擎的中繼資料資訊共用。在資料湖元資訊發現、T+1全量同步一鍵建倉中建立的庫表結構, 可以被Spark讀取並使用,Spark SQL建立或者修改的中繼資料也可以被其他引擎訪問到。
登入DLA控制台,單擊左側導覽列的SQL執行,您可以看到所有資料湖中的資料庫和表結構,對錶進行線上分析查詢,以及管理子使用者對庫表的許可權,如下圖所示。
純SQL作業
DLA Spark支援直接在控制台寫Spark SQL。無需使用者打包jar包或者寫python代碼,更有利於資料開發人員使用Spark進行資料分析。
您需要先登入DLA控制台,在Serverless Spark > 作業管理菜單中建立SparkSQL類型的作業。建立SparkSQL類型的作業後,系統預設會使用DLA中繼資料服務。如果您想關閉DLA中繼資料服務,可以使用以下兩種方式:
使用
in-memory catalog
,將不會使用DLA中繼資料服務。set spark.sql.catalogImplementation = in-memory;
設定
hive metastore version
為1.2.1或其他版本。set spark.sql.catalogImplementation = hive; set spark.sql.hive.metastore.version = 1.2.1;
SparkSQL作業的文字框中,支援直接寫SQL語句,每條SQL語句以分號隔開。
SQL語句支援下列類型命令:
SET命令
用於指定Spark的設定,一般置於整個SQL語句的最前面。
每條Set命令指定一個Spark參數的值,每條SET命令用分號隔開。
SET命令的Key和Value均不要加單引號或者雙引號。
ADD JAR命令
用於增加Spark SQL運行時,依賴的jar包,比如UDF的jar包,各類資料來源連接器的Jar包等。Jar包目前支援OSS格式路徑,一般置於整個SQL語句的最前面。
每條add jar命令指定一個oss jar包路徑,路徑字串不要加單引號和雙引號, 每條ADD JAR命令用分號隔開。
Spark SQL文法所支援的DDL或DML語句
例如查詢語句
select
。例如插入語句
insert
。例如查看資料庫
SHOW DATABASE
。
SparkSQL語句的使用限制,請參考後續章節使用限制和注意事項。
不在SQL語句最前面的
SET
命令和ADD JAR
命令,將會在SQL語句運行時生效。例如,兩個SELECT語句中間的SET
命令將會在上一條SELECT
語句執行完後,SET
命令才會生效。
代碼中使用Spark SQL
您也可以在程式中執行SQL,操作中繼資料資訊,以及讀寫表內容。下面以PySpark為例進行介紹,其他語言使用方式類似。首先,建立以下Python檔案,儲存為example.py,將檔案上傳至OSS。
from pyspark.sql import SparkSession
if __name__ == "__main__":
# init pyspark context
spark = SparkSession \
.builder \
.appName("Python SQL Test") \
.getOrCreate()
# create a database
spark.sql(
"create database if not exists dlatest comment 'c' location 'oss://{your bucket name}/{path}/' WITH DBPROPERTIES(k1='v1', k2='v2')")
# create table
spark.sql(
"create table dlatest.tp(col1 INT) PARTITIONED BY (p1 STRING, p2 STRING) location 'oss://{your bucket name}/{path}/' STORED AS parquet TBLPROPERTIES ('parquet.compress'='SNAPPY')")
# show structure
print(spark.sql("show create table dlatest.tp").collect()[0])
# insert data
spark.sql("INSERT into dlatest.tp partition(p1='a',p2='a') values(1)")
# show data
spark.sql("select * from dlatest.tp").show()
通過以下的JSON將作業通過DLA控制台提交Spark作業。
{
"name": "DLA SQL Test",
"file": "oss://path/to/example.py",
"conf": {
"spark.driver.resourceSpec": "small",
"spark.sql.hive.metastore.version": "dla",
"spark.sql.catalogImplementation": "hive",
"spark.dla.connectors": "oss",
"spark.executor.instances": 1,
"spark.dla.job.log.oss.uri": "oss://path/to/spark-logs",
"spark.executor.resourceSpec": "small"
}
}
執行成功後, 可以在DLA控制台的SQL執行頁面中找到名為dlatest
的資料庫,以及其下的tp
表。
DLA中繼資料服務對命名大小寫不敏感,在引用庫名和表名時忽略大小寫。
使用DLA中繼資料服務的限制和注意事項
1. 當前在Spark中僅支援External類型資料庫和表的建立和讀寫操作。
當前Spark串連資料湖中繼資料服務,只支援外表(External Table)的讀寫和建立操作。
這意味著在建立資料庫時, 需要顯式指定LOCATION
資訊,類似如下的SQL語句。
CREATE DATABASE db1 LOCATION 'oss://test/db1/';
同樣的,建表語句必須顯式指定表的儲存LOCATION
資訊, 類似如下SQL語句。
CREATE TABLE table1(col1 INT) LOCATION 'oss://test/db1/table1/';
需要注意以下幾個事項:
當使用者在Spark中DROP一個表或者表的某個
PARTITION
時,並不會刪除OSS上的檔案。當使用者建立一個表時,指定的表的
LOCATION
必須是庫的LOCATION
的子檔案夾。當使用者為添加表的
PARTITION
時,指定的PARTITION LOCATION
必須是表的LOCATION
的子檔案夾。當使用者
RENAME PARTITION
` 時,並不會改變其在OSS上的路徑結構。
2. 當前Spark中僅支援以OSS為儲存的外表。
在當前階段,資料湖分析SQL執行
支援多種不同的儲存,包括RDS、Table Store等等。當前在Spark中使用中繼資料服務支援讀寫以OSS為儲存的外表。
使用Spark直接建立資料庫和資料表,LOCATION
必須指定一個合法的OSS地址。
對於其他儲存的支援,後續會陸續更新。
3. 當前禁止建立DEFAULT
為名字的資料庫。
由於不允許使用DEFAULT
為名字的資料庫,需要注意以下兩個事項:
禁止在Spark中建立和操作名為
DEFAULT
的資料庫。在Spark中執行SQL時, 動作表之前需要使用
USE DatabaseName
SQL語句來切換到目標資料。或者顯式指定某個表屬於哪個資料庫, 例如SELECT * FROM db1.table1
。
4. 當前在Spark中執行 ALTER
語句有部分限制。
使用者可以通過類似ALTER DATABASE ...
等語句修改庫和表的中繼資料資訊,當前在Spark中使用這一類語句有如下的限制。
當前對資料庫,僅支援修改
COMMENT
資訊,其它如LOCATION
、PROPERTIES
禁止修改。當前僅支援修改表的
COLUMN
和PROPERTIES
資訊,如添加列、修改註解等等。請注意這裡的COLUMN
必須是非PARTITION
列。
5. 當前在 SQL執行
中操作Spark表的一些限制。
當使用者在Spark程式中建立了資料庫db1和表table1後,如果在控制台的SQL執行中操作它們,需要顯式檢測其是否存在。如嘗試刪除此資料庫時必須使用如下語句。
DROP DATABASE IF EXISTS db1;
6. 當前在Spark SQL中不支援GRANT
類賦權語句。
同開源社區一致,目前使用者無法通過Spark引擎執行一個GRANT語句來修改子賬戶賦權。