【翻譯】Flink Table Api & SQL —— 數據類型


本文翻譯自官網:https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/types.html

Flink Table Api & SQL 翻譯目錄

由於歷史原因,在 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 支持所有 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(包括兩者之間)。如果未指定長度,則 等於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) 來聲明類型,其中 是數字中整數部分的位數(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,76832,767

SQL 定義

SMALLINT

Java、Scala 定義

DataTypes.SMALLINT()

橋接到JVM類型

Java類型 輸入項 輸出量 備注
java.lang.Short X X 默認
short X (X) 僅當類型不可為空時才輸出。

INT

4字節有符號整數的數據類型,其值從-2,147,483,648to到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,808to到 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.00000000023:59:59.999999999

與SQL標准相比,不支持leap秒(23:59:6023: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:6023: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:6023: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:6023: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語義的任何可空類型。

此類型有助於表示使用NULL文字的API調用中的未知類型,以及橋接到定義該類型的JSON或Avro等格式。

這種類型在實踐中不是很有用,為完整起見在此僅提及。

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(開發技術)相關的推文

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM