日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

Spark SQL

Spark與DLA SQL引擎以及數據湖構建服務共享元數據。

重要

云原生數據湖分析(DLA)產品已退市,云原生數據倉庫 AnalyticDB MySQL 版湖倉版支持DLA已有功能,并提供更多的功能和更好的性能。AnalyticDB for MySQL相關使用文檔,請參見Spark SQL開發。

Spark訪問數據湖元數據服務

Spark引擎可以支持多種元數據服務,既支持訪問用戶自建的Hive,也支持訪問DLA統一管理的數據湖元數據。DLA統一管理的數據湖元數據管理服務,同時支持多種引擎訪問,實現多種引擎的元數據信息共享。在數據湖元信息發現、T+1全量同步一鍵建倉中創建的庫表結構, 可以被Spark讀取并使用,Spark SQL創建或者修改的元數據也可以被其他引擎訪問到。下圖是Spark SQL和DLA 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、表格存儲等等。當前在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信息,其它如LOCATION、PROPERTIES禁止修改。

  • 當前僅支持修改表的COLUMNPROPERTIES信息,如添加列、修改注解等等。請注意這里的COLUMN必須是非PARTITION列。

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

當用戶在Spark程序中創建了數據庫db1和表table1后,如果在控制臺的SQL執行中操作它們,需要顯式檢測其是否存在。如嘗試刪除此數據庫時必須使用如下語句。

DROP DATABASE IF EXISTS db1;

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

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