全部產品
Search
文件中心

Data Lake Analytics - Deprecated:Spark SQL

更新時間:Jul 06, 2024

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執行截圖

純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 DatabaseNameSQL語句來切換到目標資料。或者顯式指定某個表屬於哪個資料庫, 例如SELECT * FROM db1.table1

4. 當前在Spark中執行 ALTER 語句有部分限制。

使用者可以通過類似ALTER DATABASE ... 等語句修改庫和表的中繼資料資訊,當前在Spark中使用這一類語句有如下的限制。

  • 當前對資料庫,僅支援修改COMMENT資訊,其它如LOCATIONPROPERTIES禁止修改。

  • 當前僅支援修改表的COLUMNPROPERTIES資訊,如添加列、修改註解等等。請注意這裡的COLUMN必須是非PARTITION列。

5. 當前在 SQL執行 中操作Spark表的一些限制。

當使用者在Spark程式中建立了資料庫db1和表table1後,如果在控制台的SQL執行中操作它們,需要顯式檢測其是否存在。如嘗試刪除此資料庫時必須使用如下語句。

DROP DATABASE IF EXISTS db1;

6. 當前在Spark SQL中不支援GRANT類賦權語句。

同開源社區一致,目前使用者無法通過Spark引擎執行一個GRANT語句來修改子賬戶賦權。