資料類型
支援的資料類型
Spark SQL 和 DataFrames 支援下列資料類型
- 數字類型
ByteType
:表示 1 位元組有符號整數。數字範圍從-128
到127
。ShortType
:表示 2 位元組有符號整數。數字範圍從-32768
到32767
。IntegerType
:表示 4 位元組有符號整數。數字範圍從-2147483648
到2147483647
。LongType
:表示 8 位元組有符號整數。數字範圍從-9223372036854775808
到9223372036854775807
。FloatType
:表示 4 位元組單精度浮點數。DoubleType
:表示 8 位元組雙精度浮點數。DecimalType
:表示任意精度的有符號小數。內部由java.math.BigDecimal
支援。BigDecimal
包含任意精度的整數未縮放值和 32 位元組整數縮放。
- 字串類型
StringType
:表示字元字串值。VarcharType(length)
:StringType
的變體,具有長度限制。如果輸入字串超過長度限制,資料寫入將會失敗。注意:此類型只能用於表格架構,而非函數/運算子。CharType(length)
:VarcharType(length)
的變體,具有固定長度。讀取類型為CharType(n)
的欄位時,總是會傳回長度為n
的字串值。字元類型欄位比較會將較短的欄位填補到較長的長度。
- 二進制類型
BinaryType
:表示位元組序列值。
- 布林類型
BooleanType
:表示布林值。
- 日期時間類型
DateType
:表示包含年、月和日欄位值的值,沒有時區。TimestampType
:帶有當地時區的時間戳記 (TIMESTAMP_LTZ)。它表示包含年、月、日、小時、分鐘和秒欄位值的值,帶有工作階段當地時區。時間戳記值表示時間中的絕對點。TimestampNTZType
:沒有時區的時間戳記 (TIMESTAMP_NTZ)。它表示包含年、月、日、小時、分鐘和秒欄位值的值。所有作業都在不考慮任何時區的情況下執行。- 注意:Spark 中的 TIMESTAMP 是與 TIMESTAMP_LTZ 和 TIMESTAMP_NTZ 變化之一相關聯的使用者指定別名。使用者可以透過設定
spark.sql.timestampType
設定,將預設時間戳記類型設定為TIMESTAMP_LTZ
(預設值) 或TIMESTAMP_NTZ
。
- 注意:Spark 中的 TIMESTAMP 是與 TIMESTAMP_LTZ 和 TIMESTAMP_NTZ 變化之一相關聯的使用者指定別名。使用者可以透過設定
- 間隔類型
YearMonthIntervalType(startField, endField)
:表示由下列欄位的連續子集組成的年-月間隔- MONTH,年中的月份
[0..11]
, - YEAR,範圍內的年份
[0..178956970]
。
個別間隔欄位是非負的,但間隔本身可以有符號,並且可以是負數。
startField
是最左邊的欄位,而endField
是該類型的最右邊欄位。startField
和endField
的有效值是 0(MONTH) 和 1(YEAR)。支援的年-月間隔類型為年-月間隔類型 SQL 類型 該類型的實例 YearMonthIntervalType(YEAR, YEAR)
或YearMonthIntervalType(YEAR)
INTERVAL YEAR INTERVAL '2021' YEAR
YearMonthIntervalType(YEAR, MONTH)
INTERVAL YEAR TO MONTH INTERVAL '2021-07' YEAR TO MONTH
YearMonthIntervalType(MONTH, MONTH)
或YearMonthIntervalType(MONTH)
INTERVAL MONTH INTERVAL '10' MONTH
- MONTH,年中的月份
DayTimeIntervalType(startField, endField)
:表示由下列欄位連續子集組成的日時間隔- SECOND,分鐘內的秒數,可能包含小數秒
[0..59.999999]
, - MINUTE,小時內的分鐘數
[0..59]
, - HOUR,天數內的小時數
[0..23]
, - DAY,天數範圍
[0..106751991]
。
個別間隔欄位是非負的,但間隔本身可以有符號,並且可以是負數。
startField
是最左邊的欄位,而endField
是該類型的最右邊欄位。startField
和endField
的有效值為 0 (DAY)、1 (HOUR)、2 (MINUTE)、3 (SECOND)。支援的日時間隔類型為日時間隔類型 SQL 類型 該類型的實例 DayTimeIntervalType(DAY, DAY)
或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)
或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)
或DayTimeIntervalType(MINUTE)
INTERVAL MINUTE INTERVAL '1000' MINUTE
DayTimeIntervalType(MINUTE, SECOND)
INTERVAL MINUTE TO SECOND INTERVAL '1000:01.001' MINUTE TO SECOND
DayTimeIntervalType(SECOND, SECOND)
或DayTimeIntervalType(SECOND)
INTERVAL SECOND INTERVAL '1000.000001' SECOND
- SECOND,分鐘內的秒數,可能包含小數秒
- 複合類型
ArrayType(elementType, containsNull)
:表示值包含一連串elementType
類型的元素。containsNull
用於表示ArrayType
值中的元素是否可以有null
值。MapType(keyType, valueType, valueContainsNull)
:表示值包含一組鍵值對。鍵的資料類型由keyType
描述,值的資料類型由valueType
描述。對於MapType
值,不允許鍵有null
值。valueContainsNull
用於表示MapType
值的值是否可以有null
值。StructType(fields)
:表示值具有由一連串StructField
(fields
) 描述的結構。StructField(name, dataType, nullable)
:表示StructType
中的欄位。欄位的名稱由name
表示。欄位的資料類型由dataType
表示。nullable
用於表示這些欄位的值是否可以有null
值。
Spark SQL 的所有資料類型都位於 pyspark.sql.types
的套件中。您可以透過執行以下動作來存取它們
from pyspark.sql.types import *
資料類型 | Python 中的值類型 | 存取或建立資料類型的 API |
---|---|---|
ByteType | int 或 long 注意:數字會在執行時轉換為 1 位元組有號整數數字。請確保數字在 -128 到 127 的範圍內。 |
ByteType() |
ShortType | int 或 long 注意:數字會在執行時轉換為 2 位元組有號整數數字。請確保數字在 -32768 到 32767 的範圍內。 |
ShortType() |
IntegerType | int 或 long | IntegerType() |
LongType | long 注意:數字在執行階段會轉換為 8 位元組有號整數。請確定數字在 -9223372036854775808 到 9223372036854775807 範圍內。否則,請將資料轉換為 decimal.Decimal 並使用 DecimalType。 |
LongType() |
FloatType | float 注意:數字在執行階段會轉換為 4 位元組單精度浮點數。 |
FloatType() |
DoubleType | float | DoubleType() |
DecimalType | decimal.Decimal | DecimalType() |
StringType | string | StringType() |
BinaryType | bytearray | BinaryType() |
BooleanType | bool | BooleanType() |
TimestampType | datetime.datetime | TimestampType() |
TimestampNTZType | datetime.datetime | TimestampNTZType() |
DateType | datetime.date | DateType() |
DayTimeIntervalType | datetime.timedelta | DayTimeIntervalType() |
ArrayType | list、tuple 或陣列 | ArrayType(elementType, [containsNull]) 注意:containsNull 的預設值為 True。 |
MapType | dict | MapType(keyType, valueType, [valueContainsNull]) 注意:valueContainsNull 的預設值為 True。 |
StructType | list 或 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」的完整範例程式碼。
資料類型 | 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 |
BinaryType | Array[Byte] | BinaryType |
BooleanType | Boolean | BooleanType |
TimestampType | java.time.Instant 或 java.sql.Timestamp | TimestampType |
TimestampNTZType | java.time.LocalDateTime | TimestampNTZType |
DateType | java.time.LocalDate 或 java.sql.Date | DateType |
YearMonthIntervalType | java.time.Period | YearMonthIntervalType |
DayTimeIntervalType | java.time.Duration | DayTimeIntervalType |
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
中提供的工廠方法。
資料類型 | Java 中的值類型 | 存取或建立資料類型的 API |
---|---|---|
ByteType | byte 或 Byte | DataTypes.ByteType |
ShortType | short 或 Short | DataTypes.ShortType |
IntegerType | int 或 Integer | DataTypes.IntegerType |
LongType | long 或 Long | DataTypes.LongType |
FloatType | float 或 Float | DataTypes.FloatType |
DoubleType | double 或 Double | DataTypes.DoubleType |
DecimalType | java.math.BigDecimal | DataTypes.createDecimalType() DataTypes.createDecimalType(precision, scale)。 |
StringType | String | DataTypes.StringType |
BinaryType | byte[] | DataTypes.BinaryType |
BooleanType | boolean 或 Boolean | DataTypes.BooleanType |
TimestampType | java.time.Instant 或 java.sql.Timestamp | DataTypes.TimestampType |
TimestampNTZType | java.time.LocalDateTime | DataTypes.TimestampNTZType |
DateType | java.time.LocalDate 或 java.sql.Date | DataTypes.DateType |
YearMonthIntervalType | java.time.Period | DataTypes.YearMonthIntervalType |
DayTimeIntervalType | java.time.Duration | DataTypes.DayTimeIntervalType |
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) |
資料類型 | 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 | 不支援 | 不支援 |
StringType | character | “string” |
BinaryType | raw | “binary” |
BooleanType | logical | “bool” |
TimestampType | POSIXct | “timestamp” |
DateType | Date | “date” |
ArrayType | vector 或 list | list(type=”array”, elementType=elementType, containsNull=[containsNull]) 注意:containsNull 的預設值為 TRUE。 |
MapType | 環境 | list(type=”map”,keyType=keyType,valueType=valueType,valueContainsNull=[valueContainsNull]) 注意:valueContainsNull 的預設值為 TRUE。 |
StructType | 命名清單 | list(type=”struct”,fields=fields) 注意:fields 是 StructFields 的 Seq。此外,不允許兩個名稱相同的欄位。 |
StructField | 此欄位資料類型的 R 值類型(例如,資料類型為 IntegerType 的 StructField 為整數) | list(name=name,type=dataType,nullable=[nullable]) 注意:nullable 的預設值為 TRUE。 |
下表顯示了 Spark SQL 剖析器中用於每個資料類型的類型名稱和別名。
資料類型 | SQL 名稱 |
---|---|
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 |
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 |
ArrayType | ARRAY<element_type> |
StructType | STRUCT<field1_name: field1_type,field2_name: field2_type,…> 注意:『:』為選用。 |
MapType | MAP<key_type,value_type> |
浮點特殊值
Spark SQL 以不區分大小寫的方式支援多個浮點特殊值
- Inf/+Inf/Infinity/+Infinity:正無限大
FloatType
:等同於 ScalaFloat.PositiveInfinity
。DoubleType
:等同於 ScalaDouble.PositiveInfinity
。
- -Inf/-Infinity:負無限大
FloatType
:等同於 ScalaFloat.NegativeInfinity
。DoubleType
:等同於 ScalaDouble.NegativeInfinity
。
- NaN:非數字
FloatType
:等同於 ScalaFloat.NaN
。DoubleType
:等同於 ScalaDouble.NaN
。
正/負無限大語意
正負無限大有特別處理。它們有下列語意
- 正無限大乘以任何正值會回傳正無限大。
- 負無限大乘以任何正值會回傳負無限大。
- 正無限大乘以任何負值會回傳負無限大。
- 負無限大乘以任何負值會回傳正無限大。
- 正/負無限大乘以 0 會傳回 NaN。
- 正/負無限大等於它本身。
- 在聚合中,所有正無限大值會分組在一起。同樣地,所有負無限大值會分組在一起。
- 正無限大和負無限大在聯結鍵中會被視為一般值。
- 正無限大排序低於 NaN,但高於任何其他值。
- 負無限大排序低於任何其他值。
NaN 語意
在處理不為數字 (NaN) 時,對於不完全符合標準浮點語意的 float
或 double
類型,會有特殊處理。特別是
- NaN = NaN 會傳回 true。
- 在聚合中,所有 NaN 值會分組在一起。
- NaN 在聯結鍵中會被視為一般值。
- NaN 值在升冪順序中會排在最後,大於任何其他數字值。
範例
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'));
INSERT INTO test VALUES (2, double('infinity'));
INSERT INTO test VALUES (3, double('inf'));
INSERT INTO test VALUES (4, double('-inf'));
INSERT INTO test VALUES (5, double('NaN'));
INSERT INTO test VALUES (6, double('NaN'));
INSERT INTO test VALUES (7, double('-infinity'));
SELECT COUNT(*), c2 FROM test GROUP BY c2;
+---------+---------+
| count(1)| c2|
+---------+---------+
| 2| NaN|
| 2|-Infinity|
| 3| Infinity|
+---------+---------+