식별자

식별자

설명

식별자(identifier)는 테이블, 뷰, 스키마, 컬럼 등 데이터베이스 객체를 식별하는 데 사용하는 문자열이에요. Spark SQL에는 일반 식별자(regular identifier)와 백틱(backtick)으로 둘러싸는 구분 식별자(delimited identifier)가 있어요. 일반 식별자와 구분 식별자 모두 대소문자를 구분하지 않아요.

문법

일반 식별자

`{ letter | digit | '_' } [ , ... ]

참고: spark.sql.ansi.enforceReservedKeywordstrue로 설정하면 ANSI SQL 예약 키워드를 식별자로 사용할 수 없어요. 자세한 내용은 ANSI 규정 준수를 참조하세요.

구분 식별자

``c [ ... ]`

매개변수

  • letter

A-Z 또는 a-z의 모든 문자.

  • digit

0부터 9까지의 모든 숫자.

  • c

문자 집합의 모든 문자. 특수 문자를 이스케이프하려면 `를 사용해요(예: ```).

예약된 시스템 이름

system, session, builtin은 특별한 의미를 가지므로 사용자 정의 카탈로그(catalog)나 스키마(schema) 이름으로 사용하면 안 돼요.

이름 위치 참고
system catalog system.builtinsystem.session을 호스팅하는 가상 카탈로그. Spark는 v2 카탈로그 API를 통해 system을 로드하지 않아요. spark.sql.catalog.system = ...을 설정하는 것은 지원되지 않으며 정의되지 않은 결과를 만들어 내요. 현재 카탈로그는 system이 될 수 없어요.
builtin schema builtin이라는 영구 스키마는 허용되지만 system.builtin과 충돌하므로 권장하지 않아요.
session schema session이라는 영구 스키마는 허용되지만 system.session과 충돌하므로 권장하지 않아요.

builtin.xsession.x 같은 부분 한정(2-part) 참조는 암시적 카탈로그를 고르기 위해 작은 **미니 경로(mini-path)**를 따라가요. 기본적으로 해당 객체가 존재하면 system.builtin.x / system.session.x로 해석되고, 그렇지 않으면 현재 카탈로그의 같은 이름으로 대체돼요. 따라서 영구 builtin 또는 session 스키마의 객체는 해당 시스템 네임스페이스에 같은 이름의 객체가 존재할 때만 가려져요(shadow). 가려진 객체는 정규화된 3-part 이름(예: spark_catalog.session.x)으로 계속 접근할 수 있어요. spark.sql.legacy.persistentCatalogFirsttrue로 설정하면 우선순위가 뒤집혀서 현재 카탈로그를 먼저 시도하고 시스템 네임스페이스가 대체가 돼요.

system.builtinsystem.session 네임스페이스는 SET PATH에서 다뤄요. system.session의 임시 객체는 CREATE VIEWCREATE 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);

출처: 문서

더 알아보기 (Learn more)