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

当不带 -e-f 选项运行 ./bin/spark-sql 时,它将进入交互式 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