질의

질의 (Queries) — Hive 방언

Hive 방언(Hive dialect)은 Hive의 DQL 중 자주 사용되는 부분집합을 지원합니다. Flink SQL에서 Hive 방언으로 질의를 실행하면 HiveQL과 유사한 문법을 사용할 수 있습니다.

출처: 문서

본문

설명 (Description)

Hive 방언은 Hive의 DQL 중 자주 사용되는 부분집합을 지원합니다. 다음은 Hive 방언이 지원하는 HiveQL의 일부입니다.

문법 (Syntax)

다음 섹션은 전체 질의 문법을 설명합니다. SELECT 절은 공통 테이블 표현식(CTE), 집합 연산(set operations), 그리고 다양한 다른 절을 포함하는 질의의 일부가 될 수 있습니다.

[WITH CommonTableExpression [ , ... ]]
SELECT [ALL | DISTINCT] select_expr [ , ... ]
  FROM table_reference
  [WHERE where_condition]
  [GROUP BY col_list]
  [ORDER BY col_list]
  [CLUSTER BY col_list
    | [DISTRIBUTE BY col_list] [SORT BY col_list]
  ]
 [LIMIT [offset,] rows]
  • SELECT 문은 집합(set) 질의 또는 다른 질의의 서브쿼리(sub-query)의 일부가 될 수 있습니다
  • CommonTableExpressionWITH 절에 지정된 질의에서 파생된 임시 결과 집합입니다
  • table_reference는 질의의 입력을 나타냅니다. 일반 테이블, 뷰, join 또는 서브쿼리(sub-query)일 수 있습니다.
  • 테이블 이름과 컬럼 이름은 대소문자를 구분하지 않습니다

WHERE 절

WHERE 조건은 불리언 표현식입니다. Hive 방언은 WHERE 절에서 다양한 연산자와 UDF를 지원합니다. WHERE 절에서는 몇 가지 유형의 서브쿼리가 지원됩니다.

GROUP BY 절

자세한 내용은 GROUP BY를 참고하세요.

ORDER BY 절

ORDER BY 절은 사용자가 지정한 순서대로 결과 행을 정렬하여 반환하는 데 사용됩니다. SORT BY와 달리 ORDER BY 절은 출력에서 전역 순서(global order)를 보장합니다.

경고 — 참고: 전역 순서를 보장하려면 최종 출력을 정렬하는 단일 태스크가 하나 있어야 합니다. 따라서 출력 행 수가 너무 많으면 완료하는 데 매우 오랜 시간이 걸릴 수 있습니다.

CLUSTER/DISTRIBUTE/SORT BY

자세한 내용은 Sort/Cluster/Distributed BY를 참고하세요.

ALL과 DISTINCT 절

ALLDISTINCT 옵션은 중복 행을 반환할지 여부를 지정합니다. 이 두 옵션 중 아무것도 주어지지 않으면 기본값은 ALL입니다(모든 일치 행이 반환됨). DISTINCT는 결과 집합에서 중복 행 제거를 지정합니다.

LIMIT 절

LIMIT 절은 SELECT 문이 반환하는 행 수를 제한하는 데 사용할 수 있습니다.

LIMIT는 하나 또는 두 개의 숫자 인자를 받으며, 둘 다 음이 아닌 정수 상수여야 합니다. 첫 번째 인자는 반환할 첫 행의 오프셋을, 두 번째 인자는 반환할 최대 행 수를 지정합니다. 단일 인자가 주어지면 최대 행 수를 의미하며 오프셋의 기본값은 0입니다.

예시 (Examples)

다음은 hive 방언을 사용해 몇 가지 질의를 실행하는 예시입니다.

경고 — 참고: Hive 방언은 더 이상 Flink SQL 질의를 지원하지 않습니다. Flink 문법으로 작성하고 싶다면 기본 방언으로 전환하세요.

Flink SQL> create catalog myhive with ('type' = 'hive', 'hive-conf-dir' = '/opt/hive-conf');
[INFO] Execute statement succeeded.

Flink SQL> use catalog myhive;
[INFO] Execute statement succeeded.

Flink SQL> load module hive;
[INFO] Execute statement succeeded.

Flink SQL> use modules hive,core;
[INFO] Execute statement succeeded.

Flink SQL> set table.sql-dialect=hive;
[INFO] Session property has been set.

FLINK SQL> set sql-client.execution.result-mode=tableau;

Flink SQL> select explode(array(1,2,3)); -- call hive udtf
+----+-------------+
| op |         col |
+----+-------------+
| +I |           1 |
| +I |           2 |
| +I |           3 |
+----+-------------+
Received a total of 3 rows

Flink SQL> create table tbl (key int,value string);
[INFO] Execute statement succeeded.

Flink SQL> insert into table tbl values (5,'e'),(1,'a'),(1,'a'),(3,'c'),(2,'b'),(3,'c'),(3,'c'),(4,'d');
[INFO] Submitting SQL update statement to the cluster...
[INFO] SQL update statement has been successfully submitted to the cluster:

FLINK SQL> set execution.runtime-mode=batch; -- change to batch mode

Flink SQL> select * from tbl cluster by key; -- run cluster by
2021-04-22 16:13:57,005 INFO  org.apache.hadoop.mapred.FileInputFormat                     [] - Total input paths to process : 1
+-----+-------+
| key | value |
+-----+-------+
|   1 |     a |
|   1 |     a |
|   5 |     e |
|   2 |     b |
|   3 |     c |
|   3 |     c |
|   3 |     c |
|   4 |     d |
+-----+-------+
Received a total of 8 rows

더 알아보기 (Learn more)