databricks SQL 은 Spark SQL 을 기반으로, databricks 플랫폼에서 추가 기능과 최적화를 통해 더 사용하기 쉽게 만든 것

databricks SQL 및 databricks Runtime을 대한 SQL 명령 참조

 

일반 참조

데이터 타입, 함수, 식별자 구성 요소들을 설명

 

데이터 타입

지원되는 데이터 타입

BIGINT 8바이트의 부호 있는 정수 값을 나타냅니다.
BINARY 바이트 시퀀스 값을 나타냅니다.
BOOLEAN 불리언 값을 나타냅니다 (참 또는 거짓).
DATE 연도, 월, 일 필드로 구성된 값을 나타내며, 시간대 정보는 포함되지 않습니다.
DECIMAL(p,s) 최대 정밀도 p와 고정 소수점 s를 가진 숫자를 나타냅니다.
DOUBLE 8바이트의 배정밀도 부동 소수점 숫자를 나타냅니다.
FLOAT 4바이트의 단정밀도 부동 소수점 숫자를 나타냅니다.
INT 4바이트의 부호 있는 정수 값을 나타냅니다.
INTERVAL intervalQualifier 초 또는 월 단위의 시간 간격을 나타냅니다.
VOID 형식이 지정되지 않은 NULL을 나타냅니다.
SMALLINT 2바이트의 부호 있는 정수 값을 나타냅니다.
STRING 문자 문자열 값을 나타냅니다.
TIMESTAMP 연도, 월, 일, 시, 분, 초 필드로 구성된 값을 나타내며, 세션 로컬 시간대를 포함합니다.
TIMESTAMP_NTZ 연도, 월, 일, 시, 분, 초 필드로 구성된 값을 나타냅니다. 모든 작업은 시간대를 고려하지 않고 수행됩니다.
TINYINT 1바이트의 부호 있는 정수 값을 나타냅니다.
`ARRAY <elementType>` elementType 타입의 요소들로 구성된 시퀀스 값을 나타냅니다.
MAP < keyType,valueType > 키-값 쌍의 집합으로 구성된 값을 나타냅니다.
STRUCT < [fieldName : fieldType [NOT NULL][COMMENT str][, …]] > 필드의 시퀀스로 설명된 구조를 가진 값을 나타냅니다.

데이터 타입 분류

데이터 타입은 다음과 같은 클래스로 그룹화됨.

정수형 숫자 타입 (Integral numeric types)

정수를 나타냅니다:

정확한 숫자 타입 (Exact numeric types)

10진수 숫자를 나타냅니다:

이진 부동 소수점 타입 (Binary floating point types)

지수와 이진 표현을 사용하여 넓은 범위의 숫자를 나타냅니다:

숫자 타입 (Numeric types)

모든 숫자 데이터를 나타냅니다:

날짜-시간 타입 (Date-time types)

날짜와 시간 구성 요소를 나타냅니다:

단순 타입 (Simple types)

단일 값을 가진 타입입니다:

복합 타입 (Complex types)

복합 또는 단순 타입의 여러 구성 요소로 구성됩니다:

 함수

Spark SQL은 내장 함수와 사용자 정의 함수(UDF)라는 두 가지 기능을 제공하여 다양한 요구 사항을 충족합니다.

 

내장 함수(Built-in functions)

이 문서는 집계, 배열 및 맵, 날짜 및 타임스탬프, 그리고 JSON 데이터와 같은 주요 내장 함수 카테고리의 사용법과 설명을 제공합니다.

1. aggregate functions (집계 함수)
집계 함수는 데이터의 그룹에 대한 요약 정보를 계산하는 데 사용됩니다. 예를 들어, COUNT, SUM, AVG, MIN, MAX 등의 집계 함수는 데이터 그룹에서 특정 컬럼의 값의 합계, 평균, 최솟값, 최댓값 등을 계산합니다.


2. date and timestamp functions (날짜 및 타임스탬프 함수)
날짜 및 타임스탬프 함수는 날짜와 시간에 대한 작업을 수행하는 데 사용됩니다. 예를 들어, TO_DATE, DATE_ADD, DATEDIFF, YEAR, MONTH, DAYOFWEEK 등의 함수는 날짜 형식 변환, 날짜 간의 차이 계산, 날짜 필드 추출 등을 수행합니다.

 

3. string functions (문자열 함수)
문자열 함수는 문자열 값에 대한 작업을 수행하는 데 사용됩니다. 예를 들어, CONCATSUBSTRING, LENGTHLOWERUPPERTRIM 등의 함수는 문자열 결합, 부분 문자열 추출, 문자열 길이 계산, 대소문자 변환, 문자열의 공백 제거 등을 수행합니다.

 

4. 윈도우 함수 (Window functions)
윈도우 함수는 윈도우에 속한 데이터를 기반으로 계산됩니다. RANK()LEAD()LAG()SUM() OVER(), AVG() OVER() 등이 이에 해당합니다.

 

5. 타입 변환 함수 (Type conversion functions)
데이터 타입을 변환하는 함수입니다. CAST, CONVERT, TO_BOOLEAN, TO_DATE, TO_TIMESTAMP 등이 여기에 속합니다.

6. 조인 함수 (Join functions)
여러 테이블을 결합하고 연결하는 함수입니다. JOINLEFT JOINRIGHT JOINFULL OUTER JOINCROSS JOIN 등이 여기에 속합니다.

SQL 및 Python 사용자 정의 함수

SQL 및 Python 사용자 정의 함수(UDF)는 스칼라 값 또는 결과 집합을 반환할 수 있는 사용자가 직접 정의한 함수입니다.

 

사용자 정의 함수 만들기

1. SQL 함수 만들기
SQL 함수를 만들 때는 Databricks에서 제공하는 CREATE FUNCTION 문을 사용합니다. 함수는 SQL 또는 Python으로 정의할 수 있습니다.
예를 들어, 다음은 SQL로 작성된 간단한 함수입니다:

CREATE FUNCTION my_udf AS
SELECT col1 + col2 AS sum FROM my_table

 

2. Python 함수 만들기
Python 함수를 만들 때는 Python의 def 키워드를 사용하여 함수를 정의합니다. 이후에는 registerFunction 메서드를 사용하여 함수를 등록합니다.
예를 들어, 다음은 Python으로 작성된 함수를 등록하는 예입니다:

def my_python_udf(x):
    return x * 2

spark.udf.register("my_udf", my_python_udf)

 

사용자 정의 함수 사용하기
1. SQL에서 사용
SQL 쿼리에서 사용자 정의 함수를 사용할 때는 함수를 직접 호출하여 사용합니다.
예를 들어, 다음은 SQL 쿼리에서 사용자 정의 함수를 호출하는 예입니다:

SELECT my_udf(col) FROM my_table

2. DataFrame API에서 사용
DataFrame API를 사용할 때는 withColumn 메서드와 함께 사용자 정의 함수를 적용하여 새로운 열을 추가합니다.
예를 들어, 다음은 DataFrame API에서 사용자 정의 함수를 적용하는 예입니다:

from pyspark.sql.functions import udf
from pyspark.sql.types import IntegerType

my_udf = udf(lambda x: x * 2, IntegerType())

df = df.withColumn("new_col", my_udf(df["col"]))

 

 

식별자 (Identifiers)

식별자는 테이블, 뷰, 스키마 또는 컬럼과 같은 객체를 식별하는 데 사용되는 문자열입니다. Databricks는 비따옴표(일반) 식별자 와 백틱으로 둘러싸인 따옴표 식별자 를 지원합니다.

식별자는 참조할 때 대소문자를 구분하지 않습니다.

메타스토어 및 데이터 소스에 저장된 식별자의 경우 허용되는 문자가 제한될 수 있습니다.

구분 기호가 없는 식별자(Non delimited identifiers)

구문

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

 

매개변수

문자: A-Z 또는 a-z의 ASCII 문자 중 아무 문자.

숫자: 0에서 9까지의 ASCII 숫자.

 

구분 식별자(Delimited identifiers)

구문

`c [ ... ]`

 

매개변수

문자: A-Z 또는 a-z의 ASCII 문자 중 아무 문자.

숫자: 0에서 9까지의 ASCII 숫자.

 

예시

-- 이 문장은 비따옴표 식별자가 비ASCII 문자를 사용하기 때문에 실패합니다.
> DESCRIBE SELECT 5 AS Ä;
 INVALID_IDENTIFIER

-- 비 ASCII 문자를 사용하려면 식별자를 백틱으로 해야 합니다.
> DESCRIBE SELECT 5 AS `Ä`;
 Ä

-- 대시가 포함된 식별자는 백틱으로 해야 합니다.
> DESCRIBE SELECT 5 AS `a-b`;
 a-b

-- 공백이 포함된 식별자는 백틱으로 해야 합니다.
> DESCRIBE SELECT 5 AS `a b`;
 a b

-- 특수 문자가 포함된 식별자는 백티으로 해야 합니다.
> DESCRIBE SELECT 5 AS `a@b`;
 a@b

-- 중국어 문자가 포함된 식별자는 백틱으로 해야 합니다.
> DESCRIBE SELECT 5 AS `a中b`;
 a中b

-- 백틱이 포함된 식별자는 백틱으로 하고 이스케이프 처리해야 합니다.
> DESCRIBE SELECT 5 AS `a``b`;
 a`b

 

 

 

더보기

DDL문

DML 문

데이터 검색 문 

보조문 

보안문

 

리터럴

 

시멘틱(Semantics) 

 

 

https://learn.microsoft.com/ko-kr/azure/databricks/sql/language-manual/

https://docs.databricks.com/en/sql/language-manual/index.html

https://docs.databricks.com/en/sql/get-started/concepts.html

 

 

1. 오류 구성 요소

databricks에서 오류가 발생하면 다음 구성 요소가 포함됩니다.

- Error Class (오류 클래스)

에러 상황들을 클래스로 정리한 것입니다. 

일부 오류 클래스에는 하위 클래스가 포함 됩니다.

예시: ‘TABLE_OR_VIEW_NOT_FOUND’,  ‘INCOMPLETE_TYPE_DEFINITION.ARRAY’

모든 error class는 Error Classes 해당 문서에서 확인 가능 

- SQLSTATE

오류 클래스를 많은 제품 및 API에서 지원하는 표준 형식으로 그룹화한 5자 길이의 문자열 입니다.

예시: '42P01'

SQLSTATEDatabricks 에서 사용하는 모든 목록은  SQLSTATE 해당 문서에서 확인 가능

- Parameterized Message (매개변수화된 메시지)

매개변수에 대한 자리 표시자가 포함된 오류 메시지 입니다.

예시: 'TABLE_OR_VIEW_NOT_FOUND'에는 다음 메시지가 포함됩니다.

The table or view <relationName> cannot be found.

메시지 매개변수 값을 매개변수 태그에 매핑하여 오류 메시지를 렌더링 할 수 있습니다. 

- Message Parameters (메시지 매개변수)

오류에 대한 추가 정보를 제공하는 매개변수 및 값의 맵입니다.

예시: 'relationName' -> 'main.default.tab1'.

- Message (메시지)

매개변수가 채워진 오류 클래스 및 SQLSTATE를 포함한 완전히 렌더링된 오류 메시지입니다.

[TABLE_OR_VIEW_NOT_FOUND] The table or view `does_not_exist` cannot be found. Verify the spelling and correctness of the schema and catalog.
If you did not qualify the name with a schema, verify the current_schema() output, or qualify the name with the correct schema and catalog.
To tolerate the error on drop use DROP VIEW IF EXISTS or DROP TABLE IF EXISTS. SQLSTATE: 42P01; line 1 pos 14;
'Project [*]
+- 'UnresolvedRelation [does_not_exist], [], false

 

2. 오류 조건 처리

databrick는 오류 조건을 처리하기 위해 파이썬, 스칼라에 API를 제공합니다.

- 파이썬

파이썬의 경우  pySparkException을 사용합니다. 

  • PysparkException.getErrorClass(): 오류 클래스를 문자열로 반환합니다.
  • PysparkException.getErrorClass(): 메시지 매개변수를 딕셔너리로 반환합니다.
  • PysparkException.getErrorClass(): SQLSTATE 표현식을 문자열로 반환합니다.

- 예시

1. 예외 발생시 오류 클래스, 메시지 매개변수 및 SQLSTATE, 기본 오류 메시지 출력

req

from pyspark.errors import PySparkException

try:
  spark.sql("SELECT * FROM does_not_exist").show()
except PySparkException as ex:
  print("Error Class       : " + ex.getErrorClass())
  print("Message parameters: " + str(ex.getMessageParameters()))
  print("SQLSTATE          : " + ex.getSqlState())
  print(ex)

res

  Error Class       : TABLE_OR_VIEW_NOT_FOUND
  Message parameters: {'relationName': '`does_not_exist`'}
  SQLSTATE          : 42P01
  [TABLE_OR_VIEW_NOT_FOUND] The table or view `does_not_exist` cannot be found. Verify the spelling and correctness of the schema and catalog.
  If you did not qualify the name with a schema, verify the current_schema() output, or qualify the name with the correct schema and catalog.
  To tolerate the error on drop use DROP VIEW IF EXISTS or DROP TABLE IF EXISTS. SQLSTATE: 42P01; line 1 pos 14;
  'Project [*]
  +- 'UnresolvedRelation [does_not_exist], [], false

 

2. 예외 발생시 SQLSTATE 42P01만 포착하고 사용자 정의 메시지 표시

req

from pyspark.errors import PySparkException

try:
  spark.sql("SELECT * FROM does_not_exist").show()
except PySparkException as ex:
  if (ex.getSqlState() == "42P01"):
    print("I'm so sorry, but I cannot find: " + ex.getMessageParameters()['relationName'])
  else:
    raise

 

res

I'm so sorry, but I cannot find: `does_not_exist`

 

3. 오류 클래스 TABLE_OR_VIEW_NOT_FOUND 만 포착하고 사용자 정의 메시지 표시

req

from pyspark.errors import PySparkException

try:
  spark.sql("SELECT * FROM does_not_exist").show()
except PySparkException as ex:
  if (ex.getErrorClass() == "TABLE_OR_VIEW_NOT_FOUND"):
    print("I'm so sorry, but I cannot find: " + ex.getMessageParameters()['relationName'])
  else:
    raise

res

I'm so sorry, but I cannot find: `does_not_exist`

 

3. 사용자 정의 예외

databricks는 사용자 정의 오류를 발생시키기 위해 다음과 같은 함수를 지원합니다.

- raise_error

사용자 정의 오류 메시지로 예외를 발생시킵니다.

- assert_true

조건이 충족되지 않으면 선택적 오류 메시지와 함께 오류를 발생 시킵니다.

 

두 함수 모두 ‘USER_RAISED_EXCEPTION’  오류 클래스와 SQLSTATE ' P0001' 을 사용자 정의 메시지와 함께 반환합니다.

- 예시

> SELECT raise_error('This is a custom error message');
 [USER_RAISED_EXCEPTION] This is a custom error message. SQLSTATE: P0001
# 에러 메시지를 출력하고 SQLSTATAE P0001 을 반환
> SELECT assert_true(1 = 2, 'One is not two!');
 [USER_RAISED_EXCEPTION] One is not two! SQLSTATE: P0001
# 조건을 만족 시키지 못했을때 에러메시지를 출력
> SELECT assert_true(1 = 2);
 [USER_RAISED_EXCEPTION] '(1 = 2)' is not true! SQLSTATE: P0001

 


https://docs.databricks.com/en/error-messages/index.html

 

 

 

리눅스 실습용 wsl 설치!

 

wsl --install 

# 설치 완료 후 

wsl --list --online 
# 설치할 수 있는 배포판 목록이 출력

wsl --install -d Ubuntu-22.04

 

설치 완료 후 username&password 입력!

 

pwd 로 경로를 확인

 

윈도우 파일 탐색기에서 동일한 경로 생성 확인!

 

 

너무 신기하다. 

그동안 뭐하고 지냈냐면....

회사에 입사하고 서울 출장소에서 근무하고 있다.

 

3개월차, 업무에 대해 알아가고 있지만 익숙해질려면 시간이 많이 걸린다는 것을 뼈저리게 느끼고 있다.

 

또 다른 깨달은 점은 개발, 운영 실력을 넘어서 가장 중요한 건 소통 능력이라는 것이다.

 

혼자 공부할 때랑 다르게 현업에서 대부분 협업 형식이다. 

모든 작업은 타인과 함께 하고 영향을 끼친다. 

할일은 항상 쌓여 있고, 시간은 언제나 촉박하다. 

 

그래서 말을 할때 생각을 정리해서 전달하고, 문서도 읽는 사람을 고려해서 작성해야한다.

 

지난 3개월동안은 생각할 틈이 없을 정도로 급급했지만 , 이제부터는 생각과 지식들을 틈틈히 정리할려고 한다.

 

할 수 있다. 4월엔 좀더 자신감 넘치는 내가 될거다!  

 

 

+ Recent posts