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.sql은 file:///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 1과SELECT 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 comment와 Syntax 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)
- Spark SQL 프로그래밍 가이드: SQL과 DataFrame API의 기본을 함께 익혀보세요.
- 분산 SQL 엔진: Thrift JDBC/ODBC 서버와 Spark SQL CLI의 차이를 이해해요.
- Hive 테이블: Hive 메타스토어와 연동하는 방법을 살펴봐요.