데이터 타입

데이터 타입 (Data Types)

Spark SQL과 DataFrame이 지원하는 다양한 데이터 타입을 정리한 문서예요. 숫자, 문자열, 바이너리, 불리언, 날짜/시간, interval, 공간(spatial), 복합(complex) 타입까지 폭넓게 다루고 있어요. 각 타입의 범위와 특징, 그리고 Python·Scala·Java·R에서의 대응 값 타입과 생성 API까지 확인해 볼게요.

출처: 문서

본문

지원되는 데이터 타입 (Supported Data Types)

Spark SQL과 DataFrames는 다음 데이터 타입들을 지원해요:

  • 숫자 타입 (Numeric types)
    • ByteType: 1바이트 부호 있는 정수를 나타내요. 숫자 범위는 -128부터 127까지예요.
    • ShortType: 2바이트 부호 있는 정수를 나타내요. 숫자 범위는 -32768부터 32767까지예요.
    • IntegerType: 4바이트 부호 있는 정수를 나타내요. 숫자 범위는 -2147483648부터 2147483647까지예요.
    • LongType: 8바이트 부호 있는 정수를 나타내요. 숫자 범위는 -9223372036854775808부터 9223372036854775807까지예요.
    • FloatType: 4바이트 단정밀도(single-precision) 부동소수점 숫자를 나타내요.
    • DoubleType: 8바이트 배정밀도(double-precision) 부동소수점 숫자를 나타내요.
    • DecimalType: 임의 정밀도(arbitrary-precision) 부호 있는 decimal 숫자를 나타내요. 내부적으로 java.math.BigDecimal로 구현돼요. BigDecimal은 임의 정밀도 정수 unscaled value와 32비트 정수 scale로 구성돼요.
  • 문자열 타입 (String type)
    • StringType: 문자(character) 문자열 값을 나타내요.
    • VarcharType(length): 길이 제한이 있는 StringType의 변형이에요. 입력 문자열이 길이 제한을 초과하면 데이터 쓰기가 실패해요. 참고: 이 타입은 테이블 스키마에서만 사용할 수 있고, 함수/연산자에서는 사용할 수 없어요.
    • CharType(length): 고정 길이인 VarcharType(length)의 변형이에요. CharType(n) 타입 컬럼을 읽으면 항상 길이 n의 문자열 값을 반환해요. Char 타입 컬럼 비교는 짧은 쪽을 더 긴 길이로 패딩해요.
  • 바이너리 타입 (Binary type)
    • BinaryType: 바이트 시퀀스(byte sequence) 값을 나타내요.
  • 불리언 타입 (Boolean type)
    • BooleanType: 불리언 값을 나타내요.
  • 날짜/시간 타입 (Datetime type)
    • DateType: 시간대(time-zone)가 없는, year·month·day 필드로 구성된 값을 나타내요.
    • TimeType(precision): 시간대가 없는, seconds 필드의 소수점 뒤에 precision개의 십진 자릿수를 갖는 hour·minute·second 필드로 구성된 값을 나타내요. 값의 범위는 최소 precision 0일 때 00:00:00부터, 최대 precision 6일 때 23:59:59.999999까지예요.
    • TimestampType: 로컬 시간대가 있는 타임스탬프(TIMESTAMP_LTZ)예요. 세션 로컬 시간대와 함께 year·month·day·hour·minute·second 필드로 구성된 값을 나타내요. 타임스탬프 값은 시간상의 절대 시점(absolute point in time)을 나타내요.
    • TimestampNTZType: 시간대가 없는 타임스탬프(TIMESTAMP_NTZ)예요. year·month·day·hour·minute·second 필드로 구성된 값을 나타내요. 모든 연산은 시간대를 고려하지 않고 수행돼요.
      • 참고: Spark에서 TIMESTAMP는 TIMESTAMP_LTZ와 TIMESTAMP_NTZ 변형 중 하나와 연결되는 사용자 지정 별칭이에요. 사용자는 spark.sql.timestampType 설정을 통해 기본 타임스탬프 타입을 TIMESTAMP_LTZ(기본값) 또는 TIMESTAMP_NTZ로 설정할 수 있어요.
  • interval 타입 (Interval types)
    • YearMonthIntervalType(startField, endField): 다음 필드들의 연속된 부분집합으로 이루어진 year-month interval을 나타내요:

      • MONTH, 연 내의 월 [0..11],
      • YEAR, 범위 [0..178956970]의 연.

      개별 interval 필드는 음수가 아니지만, interval 자체는 부호를 가질 수 있고 음수일 수 있어요.

      startField는 타입의 가장 왼쪽 필드이고, endField는 가장 오른쪽 필드예요. startFieldendField의 유효한 값은 0(MONTH)과 1(YEAR)이에요. 지원되는 year-month interval 타입은 다음과 같아요:

      Year-Month Interval Type SQL type An instance of the type
      YearMonthIntervalType(YEAR, YEAR) or YearMonthIntervalType(YEAR) INTERVAL YEAR INTERVAL '2021' YEAR
      YearMonthIntervalType(YEAR, MONTH) INTERVAL YEAR TO MONTH INTERVAL '2021-07' YEAR TO MONTH
      YearMonthIntervalType(MONTH, MONTH) or YearMonthIntervalType(MONTH) INTERVAL MONTH INTERVAL '10' MONTH
    • DayTimeIntervalType(startField, endField): 다음 필드들의 연속된 부분집합으로 이루어진 day-time interval을 나타내요:

      • SECOND, 분 내의 초 및 가능한 초의 분수 [0..59.999999],
      • MINUTE, 시간 내의 분 [0..59],
      • HOUR, 일 내의 시간 [0..23],
      • DAY, 범위 [0..106751991]의 일.

      개별 interval 필드는 음수가 아니지만, interval 자체는 부호를 가질 수 있고 음수일 수 있어요.

      startField는 타입의 가장 왼쪽 필드이고, endField는 가장 오른쪽 필드예요. startFieldendField의 유효한 값은 0(DAY), 1(HOUR), 2(MINUTE), 3(SECOND)이에요. 지원되는 day-time interval 타입은 다음과 같아요:

      Day-Time Interval Type SQL type An instance of the type
      DayTimeIntervalType(DAY, DAY) or DayTimeIntervalType(DAY) INTERVAL DAY INTERVAL '100' DAY
      DayTimeIntervalType(DAY, HOUR) INTERVAL DAY TO HOUR INTERVAL '100 10' DAY TO HOUR
      DayTimeIntervalType(DAY, MINUTE) INTERVAL DAY TO MINUTE INTERVAL '100 10:30' DAY TO MINUTE
      DayTimeIntervalType(DAY, SECOND) INTERVAL DAY TO SECOND INTERVAL '100 10:30:40.999999' DAY TO SECOND
      DayTimeIntervalType(HOUR, HOUR) or DayTimeIntervalType(HOUR) INTERVAL HOUR INTERVAL '123' HOUR
      DayTimeIntervalType(HOUR, MINUTE) INTERVAL HOUR TO MINUTE INTERVAL '123:10' HOUR TO MINUTE
      DayTimeIntervalType(HOUR, SECOND) INTERVAL HOUR TO SECOND INTERVAL '123:10:59' HOUR TO SECOND
      DayTimeIntervalType(MINUTE, MINUTE) or DayTimeIntervalType(MINUTE) INTERVAL MINUTE INTERVAL '1000' MINUTE
      DayTimeIntervalType(MINUTE, SECOND) INTERVAL MINUTE TO SECOND INTERVAL '1000:01.001' MINUTE TO SECOND
      DayTimeIntervalType(SECOND, SECOND) or DayTimeIntervalType(SECOND) INTERVAL SECOND INTERVAL '1000.000001' SECOND
  • 공간 타입 (Spatial types) OGC Simple Feature Access 사양에 정의된 공간 객체예요.
    • GeometryType: GEOMETRY 값, 즉 직교 좌표계(Cartesian coordinate system)의 공간 객체를 나타내요. 이 타입은 geometry(4326)처럼 단일 SRID로 고정되거나, geometry(any)로 혼합 SRID를 허용할 수 있어요. SQL에서 GEOMETRY 컬럼은 항상 명시적 SRID 또는 ANY로 선언되어야 해요.
    • GeographyType: GEOGRAPHY 값, 즉 지리 좌표계(위도/경도)의 공간 객체를 나타내요. 가장자리 보간(edge interpolation)은 항상 SPHERICAL이에요. 이 타입은 geography(4326)처럼 단일 지리 SRID로 고정되거나, geography(any)로 혼합 SRID를 허용할 수 있어요. SQL에서 GEOGRAPHY 컬럼은 항상 명시적 SRID 또는 ANY로 선언되어야 해요. 더 자세한 내용과 내장 함수는 Geospatial (Geometry/Geography) types를 참고하세요.
  • 복합 타입 (Complex types)
    • ArrayType(elementType, containsNull): elementType 타입의 요소들로 이루어진 시퀀스를 값을 나타내요. containsNullArrayType 값의 요소가 null 값을 가질 수 있는지 나타내는 데 사용돼요.
    • MapType(keyType, valueType, valueContainsNull): 키-값 쌍의 집합으로 구성된 값을 나타내요. 키의 데이터 타입은 keyType, 값의 데이터 타입은 valueType으로 설명돼요. MapType 값에서 키는 null 값을 가질 수 없어요. valueContainsNullMapType 값의 값이 null 값을 가질 수 있는지 나타내는 데 사용돼요.
    • StructType(fields): StructField 시퀀스(fields)로 설명된 구조를 가진 값을 나타내요.
      • StructField(name, dataType, nullable): StructType의 필드를 나타내요. 필드 이름은 name으로, 필드의 데이터 타입은 dataType으로 나타내요. nullable은 이 필드들의 값이 null 값을 가질 수 있는지 나타내는 데 사용돼요.

Spark SQL의 모든 데이터 타입은 pyspark.sql.types 패키지에 있어요. 다음과 같이 접근할 수 있어요:

from pyspark.sql.types import *
데이터 타입 (Data type) Python 값 타입 (Value type in Python) 데이터 타입 접근/생성 API
ByteType int 참고: 런타임에 숫자는 1바이트 부호 있는 정수로 변환돼요. 숫자가 -128~127 범위 내에 있는지 확인해 주세요. ByteType()
ShortType int 참고: 런타임에 숫자는 2바이트 부호 있는 정수로 변환돼요. 숫자가 -32768~32767 범위 내에 있는지 확인해 주세요. ShortType()
IntegerType int IntegerType()
LongType int 참고: 런타임에 숫자는 8바이트 부호 있는 정수로 변환돼요. 숫자가 -9223372036854775808~9223372036854775807 범위 내에 있는지 확인해 주세요. 그렇지 않으면 데이터를 decimal.Decimal로 변환해 DecimalType을 사용해 주세요. LongType()
FloatType float 참고: 런타임에 숫자는 4바이트 단정밀도 부동소수점으로 변환돼요. FloatType()
DoubleType float DoubleType()
DecimalType decimal.Decimal DecimalType()
StringType str StringType()
CharType(length) str CharType(length)
VarcharType(length) str VarcharType(length)
BinaryType bytes BinaryType()
BooleanType bool BooleanType()
TimestampType datetime.datetime TimestampType()
TimestampNTZType datetime.datetime TimestampNTZType()
DateType datetime.date DateType()
DayTimeIntervalType datetime.timedelta DayTimeIntervalType()
GeometryType Geometry GeometryType(srid) 참고: srid는 필수이며 int나 문자열 "ANY"일 수 있어요.
GeographyType Geography GeographyType(srid) 참고: srid는 필수이며 int나 문자열 "ANY"일 수 있어요.
ArrayType list, tuple, or array ArrayType(elementType, [containsNull]) 참고: containsNull의 기본값은 True예요.
MapType dict MapType(keyType, valueType, [valueContainsNull]) 참고: valueContainsNull의 기본값은 True예요.
StructType list or tuple StructType(fields) 참고: fields는 StructFields의 Seq예요. 또한 같은 이름을 가진 두 필드는 허용되지 않아요.
StructField 이 필드의 데이터 타입의 Python 값 타입 (예: IntegerType 데이터 타입의 StructField는 Int) StructField(name, dataType, [nullable]) 참고: nullable의 기본값은 True예요.

Spark SQL의 모든 데이터 타입은 org.apache.spark.sql.types 패키지에 있어요. 다음과 같이 접근할 수 있어요:

import org.apache.spark.sql.types._

전체 예제 코드는 Spark 저장소의 "examples/src/main/scala/org/apache/spark/examples/sql/SparkSQLExample.scala"에서 찾을 수 있어요.

데이터 타입 (Data type) Scala 값 타입 (Value type in Scala) 데이터 타입 접근/생성 API
ByteType Byte ByteType
ShortType Short ShortType
IntegerType Int IntegerType
LongType Long LongType
FloatType Float FloatType
DoubleType Double DoubleType
DecimalType java.math.BigDecimal DecimalType
StringType String StringType
CharType(length) String CharType(length)
VarcharType(length) String VarcharType(length)
BinaryType Array[Byte] BinaryType
BooleanType Boolean BooleanType
TimestampType java.time.Instant or java.sql.Timestamp TimestampType
TimestampNTZType java.time.LocalDateTime TimestampNTZType
DateType java.time.LocalDate or java.sql.Date DateType
TimeType java.time.LocalTime TimeType
YearMonthIntervalType java.time.Period YearMonthIntervalType
DayTimeIntervalType java.time.Duration DayTimeIntervalType
GeometryType org.apache.spark.sql.types.Geometry GeometryType(srid)
GeographyType org.apache.spark.sql.types.Geography GeographyType(srid)
ArrayType scala.collection.Seq ArrayType(elementType, [containsNull]) 참고: containsNull의 기본값은 true예요.
MapType scala.collection.Map MapType(keyType, valueType, [valueContainsNull]) 참고: valueContainsNull의 기본값은 true예요.
StructType org.apache.spark.sql.Row StructType(fields) 참고: fields는 StructFields의 Seq예요. 또한 같은 이름을 가진 두 필드는 허용되지 않아요.
StructField 이 필드의 데이터 타입의 Scala 값 타입 (예: IntegerType 데이터 타입의 StructField는 Int) StructField(name, dataType, [nullable]) 참고: nullable의 기본값은 true예요.

Spark SQL의 모든 데이터 타입은 org.apache.spark.sql.types 패키지에 있어요. 데이터 타입에 접근하거나 생성하려면 org.apache.spark.sql.types.DataTypes에서 제공하는 팩토리 메서드를 사용해 주세요.

데이터 타입 (Data type) Java 값 타입 (Value type in Java) 데이터 타입 접근/생성 API
ByteType byte or Byte DataTypes.ByteType
ShortType short or Short DataTypes.ShortType
IntegerType int or Integer DataTypes.IntegerType
LongType long or Long DataTypes.LongType
FloatType float or Float DataTypes.FloatType
DoubleType double or Double DataTypes.DoubleType
DecimalType java.math.BigDecimal DataTypes.createDecimalType() DataTypes.createDecimalType(precision, scale).
StringType String DataTypes.StringType
CharType(length) String DataTypes.createCharType(length)
VarcharType(length) String DataTypes.createVarcharType(length)
BinaryType byte[] DataTypes.BinaryType
BooleanType boolean or Boolean DataTypes.BooleanType
TimestampType java.time.Instant or java.sql.Timestamp DataTypes.TimestampType
TimestampNTZType java.time.LocalDateTime DataTypes.TimestampNTZType
DateType java.time.LocalDate or java.sql.Date DataTypes.DateType
TimeType java.time.LocalTime DataTypes.TimeType
YearMonthIntervalType java.time.Period DataTypes.YearMonthIntervalType
DayTimeIntervalType java.time.Duration DataTypes.DayTimeIntervalType
GeometryType org.apache.spark.sql.types.Geometry DataTypes.createGeometryType(srid)
GeographyType org.apache.spark.sql.types.Geography DataTypes.createGeographyType(srid)
ArrayType java.util.List DataTypes.createArrayType(elementType) 참고: containsNull 값은 true가 돼요. DataTypes.createArrayType(elementType, containsNull).
MapType java.util.Map DataTypes.createMapType(keyType, valueType) 참고: valueContainsNull 값은 true가 돼요. DataTypes.createMapType(keyType, valueType, valueContainsNull)
StructType org.apache.spark.sql.Row DataTypes.createStructType(fields) 참고: fields는 StructFields의 List 또는 배열이에요. 또한 같은 이름을 가진 두 필드는 허용되지 않아요.
StructField 이 필드의 데이터 타입의 Java 값 타입 (예: IntegerType 데이터 타입의 StructField는 int) DataTypes.createStructField(name, dataType, nullable)
데이터 타입 (Data type) R 값 타입 (Value type in R) 데이터 타입 접근/생성 API
ByteType integer 참고: 런타임에 숫자는 1바이트 부호 있는 정수로 변환돼요. 숫자가 -128~127 범위 내에 있는지 확인해 주세요. "byte"
ShortType integer 참고: 런타임에 숫자는 2바이트 부호 있는 정수로 변환돼요. 숫자가 -32768~32767 범위 내에 있는지 확인해 주세요. "short"
IntegerType integer "integer"
LongType integer 참고: 런타임에 숫자는 8바이트 부호 있는 정수로 변환돼요. 숫자가 -9223372036854775808~9223372036854775807 범위 내에 있는지 확인해 주세요. 그렇지 않으면 데이터를 decimal.Decimal로 변환해 DecimalType을 사용해 주세요. "long"
FloatType numeric 참고: 런타임에 숫자는 4바이트 단정밀도 부동소수점으로 변환돼요. "float"
DoubleType numeric "double"
DecimalType 지원하지 않음 (Not supported) 지원하지 않음 (Not supported)
StringType character "string"
BinaryType raw "binary"
BooleanType logical "bool"
TimestampType POSIXct "timestamp"
DateType Date "date"
GeometryType 지원하지 않음 (Not supported) 지원하지 않음 (Not supported)
GeographyType 지원하지 않음 (Not supported) 지원하지 않음 (Not supported)
ArrayType vector or list list(type="array", elementType=elementType, containsNull=[containsNull]) 참고: containsNull의 기본값은 TRUE예요.
MapType environment list(type="map", keyType=keyType, valueType=valueType, valueContainsNull=[valueContainsNull]) 참고: valueContainsNull의 기본값은 TRUE예요.
StructType named list list(type="struct", fields=fields) 참고: fields는 StructFields의 Seq예요. 또한 같은 이름을 가진 두 필드는 허용되지 않아요.
StructField 이 필드의 데이터 타입의 R 값 타입 (예: IntegerType 데이터 타입의 StructField는 integer) list(name=name, type=dataType, nullable=[nullable]) 참고: nullable의 기본값은 TRUE예요.

다음 표는 Spark SQL 파서에서 각 데이터 타입에 사용되는 타입 이름과 별칭을 보여줘요.

데이터 타입 (Data type) SQL 이름 (SQL name)
BooleanType BOOLEAN
ByteType BYTE, TINYINT
ShortType SHORT, SMALLINT
IntegerType INT, INTEGER
LongType LONG, BIGINT
FloatType FLOAT, REAL
DoubleType DOUBLE
DateType DATE
TimestampType TIMESTAMP, TIMESTAMP_LTZ
TimestampNTZType TIMESTAMP_NTZ
StringType STRING
CharType(length) CHAR(length)
VarcharType(length) VARCHAR(length)
BinaryType BINARY
DecimalType DECIMAL, DEC, NUMERIC
YearMonthIntervalType INTERVAL YEAR, INTERVAL YEAR TO MONTH, INTERVAL MONTH
DayTimeIntervalType INTERVAL DAY, INTERVAL DAY TO HOUR, INTERVAL DAY TO MINUTE, INTERVAL DAY TO SECOND, INTERVAL HOUR, INTERVAL HOUR TO MINUTE, INTERVAL HOUR TO SECOND, INTERVAL MINUTE, INTERVAL MINUTE TO SECOND, INTERVAL SECOND
GeometryType GEOMETRY(srid) or GEOMETRY(ANY)
GeographyType GEOGRAPHY(srid) or GEOGRAPHY(ANY)
ArrayType ARRAY<element_type>
StructType STRUCT<field1_name: field1_type, field2_name: field2_type, …> 참고: ':'는 선택 사항이에요.
MapType MAP<key_type, value_type>

부동소수점 특수 값 (Floating Point Special Values)

Spark SQL은 대소문자를 구분하지 않는 방식으로 몇 가지 특수 부동소수점 값을 지원해요:

  • Inf/+Inf/Infinity/+Infinity: 양의 무한대(positive infinity)
    • FloatType: Scala Float.PositiveInfinity와 동일해요.
    • DoubleType: Scala Double.PositiveInfinity와 동일해요.
  • -Inf/-Infinity: 음의 무한대(negative infinity)
    • FloatType: Scala Float.NegativeInfinity와 동일해요.
    • DoubleType: Scala Double.NegativeInfinity와 동일해요.
  • NaN: 숫자가 아님(not a number)
    • FloatType: Scala Float.NaN과 동일해요.
    • DoubleType: Scala Double.NaN과 동일해요.

양/음 무한대 의미 (Positive/Negative Infinity Semantics)

양의 무한대와 음의 무한대에는 특별한 처리가 있어요. 그 의미는 다음과 같아요:

  • 양의 무한대에 양수 값을 곱하면 양의 무한대를 반환해요.
  • 음의 무한대에 양수 값을 곱하면 음의 무한대를 반환해요.
  • 양의 무한대에 음수 값을 곱하면 음의 무한대를 반환해요.
  • 음의 무한대에 음수 값을 곱하면 양의 무한대를 반환해요.
  • 양/음의 무한대에 0을 곱하면 NaN을 반환해요.
  • 양/음의 무한대는 자기 자신과 같아요.
  • 집계에서 모든 양의 무한대 값은 함께 그룹화돼요. 마찬가지로 모든 음의 무한대 값도 함께 그룹화돼요.
  • 양의 무한대와 음의 무한대는 조인 키에서 일반 값으로 취급돼요.
  • 양의 무한대는 NaN보다 낮게, 다른 어떤 값보다 높게 정렬돼요.
  • 음의 무한대는 다른 어떤 값보다 낮게 정렬돼요.

NaN 의미 (NaN Semantics)

표준 부동소수점 의미와 정확히 일치하지 않는 float 또는 double 타입을 다룰 때 숫자가 아님(NaN)에 대한 특별한 처리가 있어요. 구체적으로:

  • NaN = NaN은 true를 반환해요.
  • 집계에서 모든 NaN 값은 함께 그룹화돼요.
  • NaN은 조인 키에서 일반 값으로 취급돼요.
  • NaN 값은 오름차순일 때 다른 어떤 숫자 값보다 크게, 마지막에 가요.

예제 (Examples)

SELECT double('infinity') AS col;
+--------+
|     col|
+--------+
|Infinity|
+--------+

SELECT float('-inf') AS col;
+---------+
|      col|
+---------+
|-Infinity|
+---------+

SELECT float('NaN') AS col;
+---+
|col|
+---+
|NaN|
+---+

SELECT double('infinity') * 0 AS col;
+---+
|col|
+---+
|NaN|
+---+

SELECT double('-infinity') * (-1234567) AS col;
+--------+
|     col|
+--------+
|Infinity|
+--------+

SELECT double('infinity') < double('NaN') AS col;
+----+
| col|
+----+
|true|
+----+

SELECT double('NaN') = double('NaN') AS col;
+----+
| col|
+----+
|true|
+----+

SELECT double('inf') = double('infinity') AS col;
+----+
| col|
+----+
|true|
+----+

CREATE TABLE test (c1 int, c2 double);
INSERT INTO test VALUES
  (1, double('infinity')),
  (2, double('infinity')),
  (3, double('inf')),
  (4, double('-inf')),
  (5, double('NaN')),
  (6, double('NaN')),
  (7, double('-infinity'))
;
SELECT COUNT(*), c2
FROM test
GROUP BY c2
ORDER BY c2;
+---------+---------+
| count(1)|       c2|
+---------+---------+
|        2|-Infinity|
|        3| Infinity|
|        2|      NaN|
+---------+---------+

더 알아보기 (Learn more)