LanguageManual Select

LanguageManual Select

Select 구문 (Select Syntax)

[WITH CommonTableExpression (, CommonTableExpression)*]    (Note: Only available starting with Hive 0.13.0)
SELECT [ALL | DISTINCT] select_expr, 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 문은 union 쿼리의 일부이거나 다른 쿼리의 서브쿼리가 될 수 있어요.
  • table_reference는 쿼리의 입력을 나타내요. 일반 테이블, 뷰, join 구성 또는 서브쿼리일 수 있습니다.
  • 테이블 이름과 컬럼 이름은 대소문자를 구분하지 않아요. Hive 0.12 이하에서는 테이블·컬럼 이름에 영숫자와 밑줄(underscore) 문자만 허용됩니다.
  • Hive 0.13 이상에서는 컬럼 이름에 모든 Unicode 문자가 포함될 수 있어요 (HIVE-6013 참조). 백틱(`) 안에 지정된 모든 컬럼 이름은 리터럴로 취급됩니다. 백틱 문자열 안에서 백틱 문자를 나타내려면 이중 백틱( ``)을 사용하세요.
  • 0.13.0 이전 동작으로 되돌리고 컬럼 이름을 영숫자·밑줄 문자로 제한하려면 구성 속성 hive.support.quoted.identifiersnone으로 설정하세요. 이 구성에서는 백틱으로 감싼 이름이 정규식으로 해석됩니다. 자세한 내용은 컬럼 이름의 인용 식별자 지원(HIVE-6013 첨부) 및 아래 REGEX 컬럼 지정을 참고하세요.
  • 간단한 쿼리. 예를 들어, 다음 쿼리는 t1 테이블의 모든 컬럼과 모든 행을 검색해요.
SELECT * FROM t1 

참고 (Note)

Hive 0.13.0부터 FROM은 선택 사항이에요 (예: SELECT 1+1).

  • 현재 데이터베이스를 얻으려면(Hive 0.13.0부터) current_database() 함수를 사용하세요.
SELECT current_database()
  • 데이터베이스를 지정하려면 테이블 이름을 데이터베이스 이름으로 한정하거나(Hive 0.7부터 "db_name.table_name") 쿼리 문 앞에 USE 문을 실행하세요(Hive 0.6부터). "db_name.table_name"은 쿼리가 서로 다른 데이터베이스의 테이블에 접근할 수 있게 해 줍니다.

    USE는 이후의 모든 HiveQL 문에 대한 데이터베이스를 설정해요. 기본 데이터베이스로 재설정하려면 "default" 키워드로 다시 실행하세요.

USE database_name;
SELECT query_specifications;
USE default;

출처: 문서

본문

WHERE 절 (WHERE Clause)

WHERE 조건은 불리언 식이에요. 예를 들어, 다음 쿼리는 US 지역에서 amount가 10보다 큰 판매 레코드만 반환해요. Hive는 WHERE 절에서 다양한 연산자와 UDF를 지원합니다.

SELECT * FROM sales WHERE amount > 10 AND region = "US"

Hive 0.13부터 WHERE 절에서 일부 유형의 서브쿼리가 지원돼요.

ALL과 DISTINCT 절 (ALL and DISTINCT Clauses)

ALL과 DISTINCT 옵션은 중복 행을 반환할지 여부를 지정해요. 이 옵션 중 아무것도 주어지지 않으면 기본은 ALL(일치하는 모든 행 반환)이에요. DISTINCT는 결과 집합에서 중복 행을 제거합니다. 참고로 Hive는 릴리스 1.1.0부터 SELECT DISTINCT *를 지원해요 (HIVE-9194).

hive> SELECT col1, col2 FROM t1
    1 3
    1 3
    1 4
    2 5
hive> SELECT DISTINCT col1, col2 FROM t1
    1 3
    1 4
    2 5
hive> SELECT DISTINCT col1 FROM t1
    1
    2

ALL과 DISTINCT는 UNION 절에서도 사용할 수 있어요 – 자세한 내용은 Union 구문을 참고하세요.

파티션 기반 쿼리 (Partition Based Queries)

일반적으로 SELECT 쿼리는 (샘플링이 아니면) 전체 테이블을 스캔해요. PARTITIONED BY 절로 만든 테이블이라면 쿼리는 **파티션 프루닝(partition pruning)**을 수행해 쿼리가 지정한 파티션과 관련된 테이블의 일부만 스캔할 수 있습니다. Hive는 파티션 조건이 WHERE 절이나 JOIN의 ON 절에 지정된 경우 파티션 프루닝을 수행합니다. 예를 들어 page_views 테이블이 date 컬럼으로 파티션된 경우, 다음 쿼리는 2008-03-01부터 2008-03-31 사이의 날짜 행만 검색해요.

    SELECT page_views.*
    FROM page_views
    WHERE page_views.date >= '2008-03-01' AND page_views.date <= '2008-03-31'

page_views 테이블이 다른 테이블 dim_users와 조인된다면, ON 절에서 파티션 범위를 지정할 수 있어요.

    SELECT page_views.*
    FROM page_views JOIN dim_users
      ON (page_views.user_id = dim_users.id AND page_views.date >= '2008-03-01' AND page_views.date <= '2008-03-31')
  • 파티션 필터 구문(Partition Filter Syntax)도 참고하세요.
  • Group By도 참고하세요.
  • Sort By / Cluster By / Distribute By / Order By도 참고하세요.

HAVING 절 (HAVING Clause)

Hive는 버전 0.7.0에서 HAVING 절 지원을 추가했어요. 이전 버전에서는 서브쿼리를 사용해 같은 효과를 얻을 수 있습니다. 예:

SELECT col1 FROM t1 GROUP BY col1 HAVING SUM(col2) > 10

다음과 같이도 표현할 수 있어요.

SELECT col1 FROM (SELECT col1, SUM(col2) AS col2sum FROM t1 GROUP BY col1) t2 WHERE t2.col2sum > 10

LIMIT 절 (LIMIT Clause)

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

LIMIT는 하나 또는 두 개의 숫자 인자를 받는데, 둘 다 음이 아닌 정수 상수여야 해요.

첫 번째 인자는 반환할 첫 행의 오프셋을 지정하고(Hive 2.0.0부터), 두 번째는 반환할 최대 행 수를 지정합니다.

단일 인자가 주어지면 최대 행 수를 의미하고 오프셋은 기본값 0이에요.

다음 쿼리는 임의의 고객 5명을 반환해요.

SELECT * FROM customers LIMIT 5

다음 쿼리는 처음 생성된 고객 5명을 반환해요.

SELECT * FROM customers ORDER BY create_date LIMIT 5

다음 쿼리는 생성된 3번째부터 7번째 고객을 반환해요.

SELECT * FROM customers ORDER BY create_date LIMIT 2,5

REGEX 컬럼 지정 (REGEX Column Specification)

SELECT 문은 Hive 0.13.0 이전 릴리스에서, 또는 0.13.0 이후 릴리스에서 구성 속성 hive.support.quoted.identifiersnone으로 설정된 경우 정규식 기반 컬럼 지정을 사용할 수 있어요.

SELECT (ds|hr)?+.+ FROM sales

더 많은 Select 구문 (More Select Syntax)

SELECT 문의 추가 구문과 기능은 다음 문서를 참고하세요.

  • GROUP BY
  • SORT/ORDER/CLUSTER/DISTRIBUTE BY
  • JOIN (Hive Joins)
  • Join Optimization
  • Outer Join Behavior
  • UNION
  • TABLESAMPLE
  • Subqueries
  • Virtual Columns
  • Operators and UDFs
  • LATERAL VIEW
  • Windowing, OVER, and Analytics
  • Common Table Expressions

더 알아보기 (Learn more)

SELECT 문은 HiveQL의 핵심이에요. 파티션 프루닝(WHERE/ON 절의 파티션 조건으로 스캔 범위를 줄이는 것)과 LIMIT 오프셋, DISTINCT, CTE(WITH) 활용이 성능과 정확성에 큰 영향을 줍니다. 각 절의 세부 규칙은 위 링크의 언어 매뉴얼을 참고하세요.