Spark SQL CLI

Spark SQL CLI

Spark SQL CLI는 명령줄에서 SQL 쿼리를 실행하고 Hive 메타스토어 서비스를 다루기 위한 편리한 대화형 명령 도구예요. spark-sql을 실행해서 SQL 문을 직접 입력하고 결과를 바로 확인할 수 있어요. 참고로 Spark SQL CLI는 Thrift JDBC 서버와는 통신하지 못해요.

출처: 문서

본문

Spark SQL CLI는 Hive 메타스토어 서비스를 실행하고 명령줄에서 입력한 SQL 쿼리를 실행하기 위한 편리한 대화형 명령 도구입니다. 참고로 Spark SQL CLI는 Thrift JDBC 서버와 통신할 수 없어요.

Spark SQL CLI를 시작하려면 Spark 디렉터리에서 다음을 실행하세요:

./bin/spark-sql

Hive 설정은 hive-site.xml, core-site.xml, hdfs-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를 로드하려고 시도해요.

경로 해석 (Path interpretation)

Spark SQL CLI는 초기화 스크립트 파일(-i)이나 일반 SQL 파일(-f)에서 SQL을 실행할 수 있어요. 경로 URL에 스킴(scheme) 구성 요소가 없으면 해당 경로는 로컬 파일로 처리됩니다. 예를 들어 /path/to/spark-sql-cli.sqlfile:///path/to/spark-sql-cli.sql과 같아요. 사용자는 Hadoop이 지원하는 파일시스템도 사용할 수 있는데, 예를 들어 s3://<mys3bucket>/path/to/spark-sql-cli.sql이나 hdfs://<namenode>:<port>/path/to/spark-sql-cli.sql 같은 형식이에요.

지원되는 주석 유형

주석 예시
단순 주석 (simple comment)
-- This is a simple comment.

SELECT 1;

| 괄호 주석 (bracketed comment) |

/* This is a bracketed comment. */

SELECT 1;

| 중첩 괄호 주석 (nested bracketed comment) |

/*  This is a /* nested bracketed comment*/ .*/

SELECT 1;

Spark SQL CLI 대화형 셸 명령

./bin/spark-sql-e-f 옵션 없이 실행하면 대화형 셸 모드로 들어가요. 명령을 종료하려면 ;(세미콜론)을 사용합니다. 주의할 점:

  • CLI는 ;가 줄 끝에 있을 때, 그리고 \\;로 이스케이프되지 않았을 때만 명령을 종료해요.
  • ;가 명령을 종료하는 유일한 방법입니다. 사용자가 SELECT 1을 입력하고 엔터를 누르면 콘솔은 그저 입력을 기다려요.
  • 한 줄에 SELECT 1; SELECT 2;처럼 여러 명령을 입력하면 SELECT 1SELECT 2 명령이 각각 실행됩니다.
  • ;가 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 '*/')를 발생시켜요.

명령 설명
quit 또는 exit 대화형 셸을 종료합니다.
!<command> Spark SQL CLI 셸에서 셸 명령을 실행합니다.
dfs <HDFS dfs command> Spark SQL CLI 셸에서 HDFS dfs 명령을 실행합니다.
<query string> Spark SQL 쿼리를 실행하고 결과를 표준 출력으로 출력합니다.
source <filepath> CLI 안에서 스크립트 파일을 실행합니다.

예시 (Examples)

명령줄에서 쿼리 실행:

./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

무음 모드(silent mode)로 쿼리에서 파일로 데이터 덤프:

./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

더 알아보기 (Learn more)