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.identifiers를none으로 설정하세요. 이 구성에서는 백틱으로 감싼 이름이 정규식으로 해석됩니다. 자세한 내용은 컬럼 이름의 인용 식별자 지원(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.identifiers가 none으로 설정된 경우 정규식 기반 컬럼 지정을 사용할 수 있어요.
- Java regex 구문을 사용합니다. 테스트에는 http://www.fileformat.info/tool/regex.htm 을 사용해 보세요.
- 다음 쿼리는 ds와 hr을 제외한 모든 컬럼을 선택해요.
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) 활용이 성능과 정확성에 큰 영향을 줍니다. 각 절의 세부 규칙은 위 링크의 언어 매뉴얼을 참고하세요.