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