本文翻譯自官網:https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/types.html
由於歷史原因,在 Flink 1.9之前,Flink 的 Table和SQL API 數據類型與 Flink TypeInformation 緊密相關。TypeInformation
在 DataStream 和 DataSet API 中使用,並且足以描述在分布式設置中序列化和反序列化基於 JVM的 對象所需的所有信息。
但是,TypeInformation並非旨在表示獨立於實際JVM類的邏輯類型。 過去,很難將SQL標准類型映射到此抽象。 此外,某些類型不符合SQL,因此在引入時並沒有大的意義。
從Flink 1.9開始,Table&SQL API將獲得一種新類型系統,該系統可作為API穩定性和標准合規性的長期解決方案。
修改類型系統是一項涉及幾乎所有面向用戶界面的重大工作。 因此,它的引入涵蓋了多個發行版,並且社區目標是 Flink 1.10 完成此工作。
由於同時為 Table 程序添加了一個新的 planner(請參閱FLINK-11439),因此不支持 planner 和數據類型的每種組合。此外,planner 可能不支持具有所需精度或參數的每種數據類型。
注意: 在使用數據類型之前,請參閱 planner 兼容性列表和限制部分。
數據類型
數據類型描述在表中的生態系統值的邏輯類型。它可用於聲明操作的輸入或輸出類型。
Flink的數據類型與SQL標准的數據類型術語相似,但也包含有關有效處理標量表達式值的可為空性的信息。
數據類型的示例是:
INT
INT NOT NULL
INTERVAL DAY TO SECOND(3)
ROW<myField ARRAY<BOOLEAN>, myOtherField TIMESTAMP(3)>
可以在下面找到所有預定義數據類型的列表。
Table API中的數據類型
基於JVM API的用戶可以在Table API 中使用org.apache.flink.table.types.DataType的實例,或者在定義連接器,catalog 或用戶定義的函數時使用。
一個 DataType
實例有兩個作用:
- 邏輯類型的聲明,並不表示要進行傳輸或存儲的具體物理表示形式,而是定義了基於JVM的語言和表生態系統之間的界限。
- 可選: 向 pallner 提供有關數據物理表示的提示,這對於其他 API 的邊緣很有用。
對於基於 JVM 的語言,所有預定義的數據類型都在 org.apache.flink.table.api.DataTypes 中提供。
建議使用星號導入到表程序中以順利使用全部的API:
import org.apache.flink.table.api.DataTypes._ val t: DataType = INTERVAL(DAY(), SECOND(3));
物理Hites
在基於SQL的類型系統結尾和需要特定編程數據類型的表生態系統的邊緣,需要物理 hint。 hint 指示實現所需的數據格式。
例如,數據源可以表示它使用java.sql.Timestamp類而不是默認的java.time.LocalDateTime為邏輯TIMESTAMP生成值。 有了這些信息,runtime 就可以將產生的類轉換為其內部數據格式。 作為回報,數據接收器可以聲明其從 runtime 使用的數據格式。
以下是一些如何聲明橋接轉換類的示例:
// tell the runtime to not produce or consume java.time.LocalDateTime instances // but java.sql.Timestamp val t: DataType = DataTypes.TIMESTAMP(3).bridgedTo(classOf[java.sql.Timestamp]); // tell the runtime to not produce or consume boxed integer arrays // but primitive int arrays val t: DataType = DataTypes.ARRAY(DataTypes.INT().notNull()).bridgedTo(classOf[Array[Int]]);
注意: 請注意,通常只有在擴展API時才需要物理提示。預定義 source/sink/functions 的用戶無需定義此類提示。Table 程序(例如field.cast(TIMESTAMP(3).bridgedTo(Timestamp.class))
)中的提示將被忽略。
Planner 兼容性
如引言中所述,對類型系統進行重做將跨越多個版本,每種數據類型的支持取決於所使用的 planner 。本節旨在總結最重要的差異。
Old planner
Flink 1.9之前引入的Flink old planner 主要支持 type information。它僅對 data type 提供有限的支持。聲明可以轉換為 Type information 的 data type,以便 old planner 可以理解它們。
下表總結了 data type 和 type information 之間的區別。大多數簡單類型以及行類型均保持不變。時間類型,數組類型和 decimal 類型需要特別注意。不允許使用其他提示。
對於“ Type Information ” 列,該表格省略了前綴 org.apache.flink.table.api.Types
。
對於“ Data Type Representation ”列,該表格省略了前綴org.apache.flink.table.api.DataTypes
。
類型信息 | Java表達式字符串 | 數據類型表示 | 數據類型備注 |
---|---|---|---|
STRING() |
STRING |
STRING() |
|
BOOLEAN() |
BOOLEAN |
BOOLEAN() |
|
BYTE() |
BYTE |
TINYINT() |
|
SHORT() |
SHORT |
SMALLINT() |
|
INT() |
INT |
INT() |
|
LONG() |
LONG |
BIGINT() |
|
FLOAT() |
FLOAT |
FLOAT() |
|
DOUBLE() |
DOUBLE |
DOUBLE() |
|
ROW(...) |
ROW<...> |
ROW(...) |
|
BIG_DEC() |
DECIMAL |
[ DECIMAL() ] |
不是1:1的映射,因為會忽略精度和小數位數,而是使用Java的可變精度和小數位數。 |
SQL_DATE() |
SQL_DATE |
DATE() .bridgedTo(java.sql.Date.class) |
|
SQL_TIME() |
SQL_TIME |
TIME(0) .bridgedTo(java.sql.Time.class) |
|
SQL_TIMESTAMP() |
SQL_TIMESTAMP |
TIMESTAMP(3) .bridgedTo(java.sql.Timestamp.class) |
|
INTERVAL_MONTHS() |
INTERVAL_MONTHS |
INTERVAL(MONTH()) .bridgedTo(Integer.class) |
|
INTERVAL_MILLIS() |
INTERVAL_MILLIS |
INTERVAL(DataTypes.SECOND(3)) .bridgedTo(Long.class) |
|
PRIMITIVE_ARRAY(...) |
PRIMITIVE_ARRAY<...> |
ARRAY(DATATYPE.notNull() .bridgedTo(PRIMITIVE.class)) |
適用於除之外的所有JVM基本類型byte 。 |
PRIMITIVE_ARRAY(BYTE()) |
PRIMITIVE_ARRAY<BYTE> |
BYTES() |
|
OBJECT_ARRAY(...) |
OBJECT_ARRAY<...> |
ARRAY( DATATYPE.bridgedTo(OBJECT.class)) |
|
MULTISET(...) |
MULTISET(...) |
||
MAP(..., ...) |
MAP<...,...> |
MAP(...) |
|
其他通用類型 | ANY(...) |
注意:如果新型系統有問題。用戶可以隨時回退到 org.apache.flink.table.api.Types 定義的 Type information。
新的Blink planner
新的Blink planner 支持所有 old planner 的程序類型。尤其包括列出的Java表達式字符串和類型信息。
支持以下數據類型:
數據類型 | 數據類型備注 |
---|---|
STRING |
CHAR 並且VARCHAR 尚不支持。 |
BOOLEAN |
|
BYTES |
BINARY 並且VARBINARY 尚不支持。 |
DECIMAL |
支持固定的精度和比例。 |
TINYINT |
|
SMALLINT |
|
INTEGER |
|
BIGINT |
|
FLOAT |
|
DOUBLE |
|
DATE |
|
TIME |
僅支持的精度0 。 |
TIMESTAMP |
僅支持的精度3 。 |
TIMESTAMP WITH LOCAL TIME ZONE |
僅支持的精度3 。 |
INTERVAL |
僅支持MONTH 和的間隔SECOND(3) 。 |
ARRAY |
|
MULTISET |
|
MAP |
|
ROW |
|
ANY |
局限性
Java表達式字符串:Table API中的Java表達式字符串,例如table.select("field.cast(STRING)")
尚未更新為新類型的系統。使用在Old planner 部分中聲明的字符串表示形式。
連接器描述符和SQL客戶端:描述符字符串表示形式尚未更新為新類型的系統。使用在“ 連接到外部系統”部分中聲明的字符串表示形式
用戶定義的函數:用戶定義的函數尚不能聲明 data type。
數據類型列表
本節列出了所有預定義的數據類型。對於基於JVM的Table API,這些類型在 org.apache.flink.table.api.DataTypes 中也可用。
字符串
CHAR
定長字符串的數據類型。
SQL 定義
CHAR
CHAR(n)
Java、Scala 定義
DataTypes.CHAR(n)
可以使用CHAR(n)
n
是字符串的長度聲明類型。n
的值必須介於1
和之間2,147,483,647
(包括兩者之間)。如果未指定長度 ,則n
等於1
。
橋接到JVM類型
Java類型 | 輸入項 | 輸出量 | 備注 |
---|---|---|---|
java.lang.String |
X | X | 默認 |
byte[] |
X | X | 假設使用UTF-8編碼。 |
VARCHAR
/ STRING
可變長度字符串的數據類型。
SQL 定義
VARCHAR
VARCHAR(n)
STRING
Java、Scala 定義
DataTypes.VARCHAR(n)
DataTypes.STRING()
可以使用VARCHAR(n)
n
是字符串的最大長度來聲明類型。n
的值必須介於1
和之間2,147,483,647
(包括兩者之間)。如果未指定長度,則n
等於1
。
STRING
是 VARCHAR(2147483647) 的同義詞。
橋接到JVM類型
Java類型 | 輸入項 | 輸出量 | 備注 |
---|---|---|---|
java.lang.String |
X | X | 默認 |
byte[] |
X | X | 假設使用UTF-8編碼。 |
二進制字符串
BINARY
固定長度的二進制字符串(=字節序列)的數據類型。
SQL 定義
BINARY
BINARY(n)
Java、Scala 定義
DataTypes.BINARY(n)
可以使用BINARY(n)
n
是字節數來聲明類型。n
的值必須介於1
和之間2,147,483,647
(包括兩者之間)。如果未指定長度,則 n
等於1
。
橋接到JVM類型
Java類型 | 輸入項 | 輸出量 | 備注 |
---|---|---|---|
byte[] |
X | X | 默認 |
VARBINARY
/ BYTES
可變長度二進制字符串(=字節序列)的數據類型。
SQL 定義
VARBINARY
VARBINARY(n)
BYTES
Java、Scala 定義
DataTypes.VARBINARY(n)
DataTypes.BYTES()
可以使用VARBINARY(n)
n
是字節的最大長度來聲明類型。n
的值必須介於1
和之間2,147,483,647
(包括兩者之間)。如果未指定長度,則 n
等於1
。
BYTES
是 VARBINARY(2147483647) 的同義詞。
橋接到JVM類型
Java類型 | 輸入項 | 輸出量 | 備注 |
---|---|---|---|
byte[] |
X | X | 默認 |
精確數值
DECIMAL
具有固定精度和小數位數的十進制數字的數據類型。
SQL 定義
DECIMAL
DECIMAL(p)
DECIMAL(p, s)
DEC
DEC(p)
DEC(p, s)
NUMERIC
NUMERIC(p)
NUMERIC(p, s)
Java、Scala
DataTypes.DECIMAL(p, s)
可以使用 DECIMAL(p, s) 來
聲明類型,其中 p
是數字中整數部分的位數(precision),s
是數字中小數點右邊的位數(scale)。p
的值必須介於1
和之間38
(包括兩者之間)。s
的值必須介於0
和之間p
(包括兩者之間)。其中 p 的缺省值是10,s 的缺省值是
0
。
NUMERIC(p, s) 和
DEC(p, s)
是這種類型的同義詞。
橋接到JVM類型
Java類型 | 輸入項 | 輸出量 | 備注 |
---|---|---|---|
java.math.BigDecimal |
X | X | 默認 |
TINYINT
1字節有符號整數的數據類型,其值從-128
到 127
。
SQL 定義
TINYINT
Java、Scala 定義
DataTypes.TINYINT()
橋接到JVM類型
Java類型 | 輸入項 | 輸出量 | 備注 |
---|---|---|---|
java.lang.Byte |
X | X | 默認 |
byte |
X | (X) | 僅當類型不可為空時才輸出。 |
SMALLINT
2字節有符號整數的數據類型,其值從-32,768
到32,767
。
SQL 定義
SMALLINT
Java、Scala 定義
DataTypes.SMALLINT
()
橋接到JVM類型
Java類型 | 輸入項 | 輸出量 | 備注 |
---|---|---|---|
java.lang.Short |
X | X | 默認 |
short |
X | (X) | 僅當類型不可為空時才輸出。 |
INT
4字節有符號整數的數據類型,其值從-2,147,483,648
to到2,147,483,647
。
SQL 定義
INT
INTEGER
Java、Scala 定義
DataTypes.INT()
INTEGER
是此類型的同義詞。
橋接到JVM類型
Java類型 | 輸入項 | 輸出量 | 備注 |
---|---|---|---|
java.lang.Integer |
X | X | 默認 |
int |
X | (X) | 僅當類型不可為空時才輸出。 |
BIGINT
8字節有符號整數的數據類型,其值從-9,223,372,036,854,775,808
to到 9,223,372,036,854,775,807
。
SQL 定義
BIGINT
Java、Scala 定義
DataTypes.BIGINT()
橋接到JVM類型
Java類型 | 輸入項 | 輸出量 | 備注 |
---|---|---|---|
java.lang.Long |
X | X | 默認 |
long |
X | (X) | 僅當類型不可為空時才輸出。 |
近似數值
FLOAT
4字節單精度浮點數的數據類型。
與SQL標准相比,該類型不帶參數。
SQL 定義
FLOAT
Java、Scala 定義
DataTypes.FLOAT()
橋接到JVM類型
Java類型 | 輸入項 | 輸出量 | 備注 |
---|---|---|---|
java.lang.Float |
X | X | 默認 |
float |
X | (X) | 僅當類型不可為空時才輸出。 |
DOUBLE
8字節雙精度浮點數的數據類型。
SQL 定義
DOUBLE
DOUBLE PRECISION
Java、Scala 定義
DataTypes.DOUBLE()
DOUBLE PRECISION
是此類型的同義詞。
橋接到JVM類型
Java類型 | 輸入項 | 輸出量 | 備注 |
---|---|---|---|
java.lang.Double |
X | X | 默認 |
double |
X | (X) | 僅當類型不可為空時才輸出。 |
日期和時間
DATE
日期的數據類型,包含 year-month-day
范圍從0000-01-01
到的值9999-12-31
。
與SQL標准相比,year 范圍從 0000 開始。
SQL 定義
DATE
Java、Scala 定義
DataTypes.DATE()
橋接到JVM類型
Java類型 | 輸入項 | 輸出量 | 備注 |
---|---|---|---|
java.time.LocalDate |
X | X | 默認 |
java.sql.Date |
X | X | |
java.lang.Integer |
X | X | 描述自紀元以來的天數。 |
int |
X | (X) | 描述自紀元以來的天數。 僅當類型不可為空時才輸出。 |
TIME
沒有時區的時間數據類型,其hour:minute:second[.fractional]
精度高達納秒,范圍從00:00:00.000000000
到23:59:59.999999999
。
與SQL標准相比,不支持leap秒(23:59:60
和23:59:61
),因為語義更接近java.time.LocalTime
。沒有提供帶時區的時間。
SQL 定義
TIME
TIME(p)
Java、Scala 定義
DataTypes.TIME(p)
可以使用TIME(p)
p
是小數部分 秒的位數(precision)來聲明類型。p
的值必須介於0
和之間9
(包括兩者之間)。如果未指定精度,則 p
等於0
。
橋接到JVM類型
Java類型 | 輸入項 | 輸出量 | 備注 |
---|---|---|---|
java.time.LocalTime |
X | X | 默認 |
java.sql.Time |
X | X | |
java.lang.Integer |
X | X | 描述一天中的毫秒數。 |
int |
X | (X) | 描述一天中的毫秒數。 僅當類型不可為空時才輸出。 |
java.lang.Long |
X | X | 描述一天中的納秒數。 |
long |
X | (X) | 描述一天中的納秒數。 僅當類型不可為空時才輸出。 |
TIMESTAMP
不帶時區的時間戳數據類型,其year-month-day hour:minute:second[.fractional]
精度高達納秒,范圍從0000-01-01 00:00:00.000000000
到 9999-12-31 23:59:59.999999999
。
與SQL標准相比,不支持leap秒(23:59:60
和23:59:61
),因為語義更接近java.time.LocalDateTime
。
不支持從BIGINT
(與JVM long
類型)之間的轉換,因為這意味着時區。但是,此類型沒有時區。對於更類似 java.time.Instant 的語義,請使用 TIMESTAMP WITH LOCAL TIME ZONE
。
SQL 定義
TIMESTAMP
TIMESTAMP(p)
TIMESTAMP WITHOUT TIME ZONE
TIMESTAMP(p) WITHOUT TIME ZONE
Java、Scala 定義
DataTypes.TIMESTAMP(p)
可以使用TIMESTAMP(p)
p
是小數部分 秒的位數(precision)來聲明類型。p
的值必須介於0
和之間9
(包括兩者之間)。如果未指定精度,則 p
等於6
。
TIMESTAMP(p) WITHOUT TIME ZONE
是此類型的同義詞。
橋接到JVM類型
Java類型 | 輸入項 | 輸出量 | 備注 |
---|---|---|---|
java.time.LocalDateTime |
X | X | 默認 |
java.sql.Timestamp |
X | X |
TIMESTAMP WITH TIME ZONE
timestamp with time zone 數據類型由 year-month-day hour:minute:second[.fractional] 與 zone 組成,
精度達納秒,值范圍為0000-01-01 00:00:00.000000000 +14:59
至 9999-12-31 23:59:59.999999999 -14:59
。
與SQL標准相比,不支持leap秒(23:59:60
和23:59:61
),因為語義更接近java.time.OffsetDateTime
。
與 TIMESTAMP WITH LOCAL TIME ZONE 相比,時區偏移量信息物理存儲在每個數據中。它單獨用於每個計算,可視化或與外部系統的通信。
SQL 定義
TIMESTAMP WITH TIME ZONE
TIMESTAMP(p) WITH TIME ZONE
Java、Scala 定義
DataTypes.TIMESTAMP_WITH_TIME_ZONE(p)
可以使用TIMESTAMP(p) WITH TIME
p
是小數部分秒的位數(precision)來聲明類型。p
的值必須介於0
和之間9
(包括兩者之間)。如果未指定精度,p
則等於6
。
橋接到JVM類型
Java類型 | 輸入項 | 輸出量 | 備注 |
---|---|---|---|
java.time.OffsetDateTime |
X | X | 默認 |
java.time.ZonedDateTime |
X | 忽略區域ID。 |
TIMESTAMP WITH LOCAL TIME ZONE
timestamp with local time zone 數據類型,由 year-month-day hour:minute:second[.fractional] zone 組成,
精度高達納秒,范圍從0000-01-01 00:00:00.000000000 +14:59
到 9999-12-31 23:59:59.999999999 -14:59
。
不支持Leap 秒(23:59:60
和23:59:61
),因為語義更接近java.time.OffsetDateTime
。
與TIMESTAMP WITH TIME ZONE相比
,時區偏移量信息並非物理存儲在每個數據中。相反,該類型在表生態系統的邊緣采用UTC時區中的java.time.Instant語義。每個數據都在當前會話中配置的本地時區中進行解釋,以進行計算和可視化。
通過允許根據已配置的會話時區解釋UTC時間戳,此類型填補了時區空閑和時區強制性時間戳類型之間的空白。
SQL 定義
TIMESTAMP WITH LOCAL TIME ZONE
TIMESTAMP(p) WITH LOCAL TIME ZONE
Java、Scala 定義
DataTypes.TIMESTAMP_WITH_LOCAL_TIME_ZONE(p)
可以使用TIMESTAMP(p) WITH LOCAL TIME ZONE
p
是小數部分秒的位數(precision)來聲明類型。p
的值必須介於0
和之間9
(包括兩者之間)。如果未指定精度,p
則等於6
。
橋接到JVM類型
Java類型 | 輸入項 | 輸出量 | 備注 |
---|---|---|---|
java.time.Instant |
X | X | 默認 |
java.lang.Integer |
X | X | 描述自紀元以來的秒數。 |
int |
X | (X) | 描述自紀元以來的秒數。 僅當類型不可為空時才輸出。 |
java.lang.Long |
X | X | 描述自紀元以來的毫秒數。 |
long |
X | (X) | 描述自紀元以來的毫秒數。 僅當類型不可為空時才輸出。 |
INTERVAL YEAR TO MONTH
一組年月間隔類型的數據類型。
必須將類型參數化為以下分辨率之一:
- 年間隔
- 幾年到幾個月的間隔
- 間隔幾個月。
年-月的間隔由+years-months 到組成,范圍從-9999-11
到 +9999-11
。
所有類型的分辨率的值表示均相同。例如,始終以“年月間隔”格式(默認年份精度)表示50個月的間隔:+04-02(4年2個月)
。
SQL 定義
INTERVAL YEAR
INTERVAL YEAR(p)
INTERVAL YEAR(p) TO MONTH
INTERVAL MONTH
Java、Scala 定義
DataTypes.INTERVAL(DataTypes.YEAR()) DataTypes.INTERVAL(DataTypes.YEAR(p)) DataTypes.INTERVAL(DataTypes.YEAR(p), DataTypes.MONTH()) DataTypes.INTERVAL(DataTypes.MONTH())
可以使用以上組合來聲明類型,其中p是
年(年精度)的位數。p
的值必須介於1
和之間4
(包括兩者之間)。如果未指定年精度,p
則等於2
。
橋接到JVM類型
Java類型 | 輸入項 | 輸出量 | 備注 |
---|---|---|---|
java.time.Period |
X | X | 忽略days 零件。默認 |
java.lang.Integer |
X | X | 描述月份數。 |
int |
X | (X) | 描述月份數。 僅當類型不可為空時才輸出。 |
INTERVAL DAY TO MONTH
一組天時間間隔類型的數據類型。
必須將類型參數設置為以下分辨率之一,精度最高為納秒:
- 天間隔
- 幾天到幾小時的間隔
- 天到分鍾的間隔
- 天到秒的間隔
- 小時間隔
- 小時到幾分鍾的間隔,
- 小時到幾秒的間隔,
- 分鍾間隔
- 分鍾到秒的間隔,
- 或秒間隔。
一天中的時間間隔包含,+days hours:months:seconds.fractional
范圍從 -999999 23:59:59.999999999
到+999999 23:59:59.999999999
。所有類型的分辨率的值表示均相同。例如,秒間隔 70 始終以天間隔格式(具有默認精度)表示:+00 00:01:10.000000。
SQL 定義
INTERVAL DAY
INTERVAL DAY(p1)
INTERVAL DAY(p1) TO HOUR
INTERVAL DAY(p1) TO MINUTE
INTERVAL DAY(p1) TO SECOND(p2)
INTERVAL HOUR
INTERVAL HOUR TO MINUTE
INTERVAL HOUR TO SECOND(p2)
INTERVAL MINUTE
INTERVAL MINUTE TO SECOND(p2)
INTERVAL SECOND
INTERVAL SECOND(p2)
Java、Scala 定義
DataTypes.INTERVAL(DataTypes.DAY()) DataTypes.INTERVAL(DataTypes.DAY(p1)) DataTypes.INTERVAL(DataTypes.DAY(p1), DataTypes.HOUR()) DataTypes.INTERVAL(DataTypes.DAY(p1), DataTypes.MINUTE()) DataTypes.INTERVAL(DataTypes.DAY(p1), DataTypes.SECOND(p2)) DataTypes.INTERVAL(DataTypes.HOUR()) DataTypes.INTERVAL(DataTypes.HOUR(), DataTypes.MINUTE()) DataTypes.INTERVAL(DataTypes.HOUR(), DataTypes.SECOND(p2)) DataTypes.INTERVAL(DataTypes.MINUTE()) DataTypes.INTERVAL(DataTypes.MINUTE(), DataTypes.SECOND(p2)) DataTypes.INTERVAL(DataTypes.SECOND()) DataTypes.INTERVAL(DataTypes.SECOND(p2))
可以使用上述組合聲明類型,其中p1
是天的位數(日精度)和p2
是秒的位數(分數精度)。 p1
的值必須介於1
和之間6
(包括兩者之間)。p2
的值必須介於0
和之間9
(包括兩者之間)。如果未p1
指定,默認情況下等於 2。如果未
p2
指定,默認情況下等於6。
橋接到JVM類型
Java類型 | 輸入項 | 輸出量 | 備注 |
---|---|---|---|
java.time.Duration |
X | X | 默認 |
java.lang.Long |
X | X | 描述毫秒數。 |
long |
X | (X) | 描述毫秒數。 僅當類型不可為空時才輸出。 |
構造數據類型
ARRAY
具有相同子類型的元素數組的數據類型。
與SQL標准相比,無法指定數組的最大基數,但固定為2,147,483,647
。另外,任何有效類型都支持作為子類型。
SQL 定義
ARRAY<t>
t ARRAY
Java、Scala 定義
DataTypes.ARRAY(t)
可以使用 ARRAY<t>
t
是所包含元素的數據類型來聲明類型。
t ARRAY
是接近SQL標准的同義詞。例如,INT ARRAY
等效於ARRAY<INT>
。
橋接到JVM類型
Java類型 | 輸入項 | 輸出量 | 備注 |
---|---|---|---|
Ť[] |
(X) | (X) | 取決於子類型。默認 |
MULTISET
多重集的數據類型(= bag )。與集合不同,它允許每個元素具有公共子類型的多個實例。每個唯一值(包括NULL
)都映射到某種多重性。
元素類型沒有限制;確保唯一性是用戶的責任。
SQL 定義
MULTISET<t>
t MULTISET
Java、Scala 定義
DataTypes.MULTISET(t)
可以使用 MULTISET<t>
t
是所包含元素的數據類型來聲明類型。
t MULTISET
是接近SQL標准的同義詞。例如,INT MULTISET
等效於MULTISET<INT>
。
橋接到JVM類型
Java類型 | 輸入項 | 輸出量 | 備注 |
---|---|---|---|
java.util.Map<t, java.lang.Integer> |
X | X | 將每個值分配給整數倍數。默認 |
ROW
字段序列的數據類型。
字段由字段名稱,字段類型和可選描述組成。表的行 最特定類型是行類型。在這種情況下,該行的每一列對應於具有與該列相同序號位置的行類型的字段。
與SQL標准相比,可選的字段描述簡化了復雜結構的處理。
Row 類型類似於其他非標准兼容框架中已知的STRUCT類型。
SQL 定義
ROW<n0 t0, n1 t1, ...> ROW<n0 t0 'd0', n1 t1 'd1', ...> ROW(n0 t0, n1 t1, ...> ROW(n0 t0 'd0', n1 t1 'd1', ...)
Java、Scala 定義
DataTypes.ROW(DataTypes.FIELD(n0, t0), DataTypes.FIELD(n1, t1), ...) DataTypes.ROW(DataTypes.FIELD(n0, t0, d0), DataTypes.FIELD(n1, t1, d1), ...)
可以使用ROW<n0 t0 'd0', n1 t1 'd1', ...>
where 來聲明類型,其中where n
是字段的唯一名稱,是字段t
的邏輯類型,是字段d
的描述。
ROW(...)
是接近SQL標准的同義詞。例如,ROW(myField INT, myOtherField BOOLEAN)
等效於ROW<myField INT, myOtherField BOOLEAN>
。
橋接到JVM類型
Java類型 | 輸入項 | 輸出量 | 備注 |
---|---|---|---|
org.apache.flink.types.Row |
X | X | 默認 |
其他數據類型
BOOLEAN
(可能)具有三值邏輯 TRUE,FALSE 和 UNKNOWN 的布爾數據類型。
SQL 定義
BOOLEAN
Java、Scala 定義
DataTypes.BOOLEAN()
橋接到JVM類型
Java類型 | 輸入項 | 輸出量 | 備注 |
---|---|---|---|
java.lang.Boolean |
X | X | 默認 |
boolean |
X | (X) | 僅當類型不可為空時才輸出。 |
NULL
表示空類型 NULL
值的數據類型。
NULL 類型是SQL標准的擴展。除了 NULL 類型之外沒有其他 NULL 值,因此可以將其強制轉換為類似於JVM語義的任何可空類型。
這種類型在實踐中不是很有用,為完整起見在此僅提及。
SQL 定義
NULL
Java、Scala 定義
DataTypes.NULL()
橋接到JVM類型
Java類型 | 輸入項 | 輸出量 | 備注 |
---|---|---|---|
java.lang.Object |
X | X | 默認 |
任何班級 | (X) | 任何非原始類型。 |
ANY
任意序列化類型的數據類型。此類型是表生態系統內的黑匣子,僅在邊緣反序列化。
any類型是SQL標准的擴展。
SQL 定義
ANY('class', 'snapshot')
Java、Scala 定義
DataTypes.ANY(class, serializer) DataTypes.ANY(typeInfo)
可以使用ANY('class', 'snapshot')
class
是原始類來聲明類型,並 以Base64編碼TypeSerializerSnapshot 進行 snapshot 序列化。通常,類型字符串不是直接聲明的,而是在保留類型時生成的。
在API中,可以通過直接提供Class + TypeSerializer或通過傳遞TypeInformation並讓框架從那里提取Class + TypeSerializer來聲明ANY類型。
橋接到JVM類型
Java類型 | 輸入項 | 輸出量 | 備注 |
---|---|---|---|
類 | X | X | 原始類或子類(用於輸入)或超類(用於輸出)。默認 |
byte[] |
X |
歡迎關注Flink菜鳥公眾號,會不定期更新Flink(開發技術)相關的推文