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 交互式 Shell 命令

当运行 ./bin/spark-sql 时,如果没有 -e-f 选项,它将进入交互式 shell 模式。使用 ;(分号)来终止命令。请注意

  1. CLI 仅在 ; 位于行尾且未被 \\; 转义时使用 ; 来终止命令。
  2. ; 是终止命令的唯一方法。如果用户输入 SELECT 1 并按回车键,控制台将等待输入。
  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 语句。上面的示例将被终止为 /* This is a comment contains */ SELECT 1,Spark 将分别提交这两个命令并抛出解析器错误 (unclosed bracketed commentSyntax error at or near '*/')。

命令描述
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