식별자
식별자
설명
식별자(identifier)는 테이블, 뷰, 스키마, 컬럼 등 데이터베이스 객체를 식별하는 데 사용하는 문자열이에요. Spark SQL에는 일반 식별자(regular identifier)와 백틱(backtick)으로 둘러싸는 구분 식별자(delimited identifier)가 있어요. 일반 식별자와 구분 식별자 모두 대소문자를 구분하지 않아요.
문법
일반 식별자
`{ letter | digit | '_' } [ , ... ]
참고: spark.sql.ansi.enforceReservedKeywords를 true로 설정하면 ANSI SQL 예약 키워드를 식별자로 사용할 수 없어요. 자세한 내용은 ANSI 규정 준수를 참조하세요.
구분 식별자
``c [ ... ]`
매개변수
- letter
A-Z 또는 a-z의 모든 문자.
- digit
0부터 9까지의 모든 숫자.
- c
문자 집합의 모든 문자. 특수 문자를 이스케이프하려면 `를 사용해요(예: ```).
예약된 시스템 이름
system, session, builtin은 특별한 의미를 가지므로 사용자 정의 카탈로그(catalog)나 스키마(schema) 이름으로 사용하면 안 돼요.
| 이름 | 위치 | 참고 |
|---|---|---|
system |
catalog | system.builtin과 system.session을 호스팅하는 가상 카탈로그. Spark는 v2 카탈로그 API를 통해 system을 로드하지 않아요. spark.sql.catalog.system = ...을 설정하는 것은 지원되지 않으며 정의되지 않은 결과를 만들어 내요. 현재 카탈로그는 system이 될 수 없어요. |
builtin |
schema | builtin이라는 영구 스키마는 허용되지만 system.builtin과 충돌하므로 권장하지 않아요. |
session |
schema | session이라는 영구 스키마는 허용되지만 system.session과 충돌하므로 권장하지 않아요. |
builtin.x나 session.x 같은 부분 한정(2-part) 참조는 암시적 카탈로그를 고르기 위해 작은 **미니 경로(mini-path)**를 따라가요. 기본적으로 해당 객체가 존재하면 system.builtin.x / system.session.x로 해석되고, 그렇지 않으면 현재 카탈로그의 같은 이름으로 대체돼요. 따라서 영구 builtin 또는 session 스키마의 객체는 해당 시스템 네임스페이스에 같은 이름의 객체가 존재할 때만 가려져요(shadow). 가려진 객체는 정규화된 3-part 이름(예: spark_catalog.session.x)으로 계속 접근할 수 있어요. spark.sql.legacy.persistentCatalogFirst를 true로 설정하면 우선순위가 뒤집혀서 현재 카탈로그를 먼저 시도하고 시스템 네임스페이스가 대체가 돼요.
system.builtin과 system.session 네임스페이스는 SET PATH에서 다뤄요. system.session의 임시 객체는 CREATE VIEW와 CREATE FUNCTION (SQL) 문서에 나와 있어요.
예시
-- 이 CREATE TABLE은 잘못된 식별자 이름 a.b 때문에 ParseException으로 실패해요
CREATE TABLE test (a.b int);
Error in query:
[PARSE_SYNTAX_ERROR] Syntax error at or near '.': extra input '.'(line 1, pos 20)
== SQL ==
CREATE TABLE test (a.b int)
--------------------^^^
-- 이 CREATE TABLE은 정상 동작해요
CREATE TABLE test (`a.b` int);
-- 이 CREATE TABLE은 특수 문자 `가 이스케이프되지 않아 ParseException으로 실패해요
CREATE TABLE test1 (`a`b` int);
Error in query:
[PARSE_SYNTAX_ERROR] Syntax error at or near '`'(line 1, pos 24)
== SQL ==
CREATE TABLE test1 (`a`b` int)
------------------------^^^
-- 이 CREATE TABLE은 정상 동작해요
CREATE TABLE test (`a``b` int);
출처: 문서