Spark SQL CLI

Spark SQL CLI 是一個便利的互動式命令工具,用於執行 Hive 元資料儲存服務和執行從命令列輸入的 SQL 查詢。請注意,Spark SQL CLI 無法與 Thrift JDBC 伺服器通訊。

若要啟動 Spark SQL CLI,請在 Spark 目錄中執行下列動作

./bin/spark-sql

Hive 的設定是透過將 hive-site.xmlcore-site.xmlhdfs-site.xml 檔案放置在 conf/ 中來完成。

Spark SQL 命令列選項

您可以執行 ./bin/spark-sql --help 以取得所有可用選項的完整清單。

CLI options:
 -d,--define <key=value>          Variable substitution to apply to Hive
                                  commands. e.g. -d A=B or --define A=B
    --database <databasename>     Specify the database to use
 -e <quoted-query-string>         SQL from command line
 -f <filename>                    SQL from files
 -H,--help                        Print help information
    --hiveconf <property=value>   Use value for given property
    --hivevar <key=value>         Variable substitution to apply to Hive
                                  commands. e.g. --hivevar A=B
 -i <filename>                    Initialization SQL file
 -S,--silent                      Silent mode in interactive shell
 -v,--verbose                     Verbose mode (echo executed SQL to the
                                  console)

hiverc 檔案

在未呼叫 -i 的情況下,Spark SQL CLI 將嘗試載入 $HIVE_HOME/bin/.hiverc$HOME/.hiverc 作為初始化檔案。

路徑詮釋

Spark SQL CLI 支援從初始化指令碼檔案 (-i) 或一般 SQL 檔案 (-f) 執行 SQL,如果路徑 URL 沒有架構元件,路徑將會當成本機檔案處理。例如:/path/to/spark-sql-cli.sql 等於 file:///path/to/spark-sql-cli.sql。使用者也可以使用 Hadoop 支援的檔案系統,例如 s3://<mys3bucket>/path/to/spark-sql-cli.sqlhdfs://<namenode>:<port>/path/to/spark-sql-cli.sql

支援的註解類型

註解範例
簡單註解 -- 這是簡單註解。
SELECT 1;
括號註解 /* 這是括號註解。 */
SELECT 1;
巢狀括號註解 /* 這是 /* 巢狀括號註解 */ 。*/
SELECT 1;

Spark SQL CLI 互動式殼層命令

./bin/spark-sql 在沒有 -e-f 選項的情況下執行時,它會進入互動式殼層模式。使用 ;(分號)終止命令。請注意

  1. CLI 僅在分號 ; 出現在行尾時才會用來終止命令,且不會被 \\; 逸出。
  2. ; 是終止命令的唯一方法。如果使用者輸入 SELECT 1 並按下 Enter,主控台只會等待輸入。
  3. 如果使用者在同一行輸入多個命令,例如 SELECT 1; SELECT 2;,命令 SELECT 1SELECT 2 會個別執行。
  4. 如果 ; 出現在 SQL 陳述式中(不是行尾),則它沒有特殊意義
    -- This is a ; comment
    SELECT ';' as a;
    

    這只是一個註解行,後接一個 SQL 查詢,會傳回一個字串文字。

    /* This is a comment contains ;
    */ SELECT 1;
    

    然而,如果「;」是該行的結尾,它會終止 SQL 陳述式。上述範例會終止為 /* 這是包含 */ SELECT 1,Spark 會提交這兩個分開的命令,並擲出剖析器錯誤(未關閉的括號註解語法錯誤在或接近 '*/')。

命令說明
quitexit 退出互動式 shell。
!<command> 從 Spark SQL CLI shell 執行 shell 命令。
dfs <HDFS dfs command> 從 Spark SQL CLI shell 執行 HDFS dfs 命令
<query string> 執行 Spark SQL 查詢,並將結果列印至標準輸出。
source <filepath> 在 CLI 內執行腳本檔。

範例

從命令列執行查詢的範例

./bin/spark-sql -e 'SELECT COL FROM TBL'

設定 Hive 組態變數的範例

./bin/spark-sql -e 'SELECT COL FROM TBL' --hiveconf hive.exec.scratchdir=/home/my/hive_scratch

設定 Hive 組態變數並在 SQL 查詢中使用的範例

./bin/spark-sql -e 'SELECT ${hiveconf:aaa}' --hiveconf aaa=bbb --hiveconf hive.exec.scratchdir=/home/my/hive_scratch
spark-sql> SELECT ${aaa};
bbb

設定 Hive 變數取代的範例

./bin/spark-sql --hivevar aaa=bbb --define ccc=ddd
spark-sql> SELECT ${aaa}, ${ccc};
bbb ddd

使用靜默模式將資料從查詢中傾印至檔案的範例

./bin/spark-sql -S -e 'SELECT COL FROM TBL' > result.txt

非互動式執行腳本的範例

./bin/spark-sql -f /path/to/spark-sql-script.sql

在進入互動模式前執行初始化腳本的範例

./bin/spark-sql -i /path/to/spark-sql-init.sql

進入互動模式的範例

./bin/spark-sql
spark-sql> SELECT 1;
1
spark-sql> -- This is a simple comment.
spark-sql> SELECT 1;
1

在註解中使用跳脫字元 ; 進入互動模式的範例

./bin/spark-sql
spark-sql>/* This is a comment contains \\;
         > It won't be terminated by \\; */
         > SELECT 1;
1