Skip to main content

Raw

说明

支持:

  • Format: Serialization Schema 序列化格式
  • Format: Deserialization Schema 反序列化格式

Raw format 允许读写原始(基于字节)数据作为单个列的值。

注意: 这种格式会将 null 值编码成 byte[] 类型的 null,因此在 upsert-kafka 中使用时可能会有限制,因为 upsert-kafka 将 null 值视为删除消息(在key上删除)。 因此,如果该字段可能有 null 值,我们建议避免使用 upsert-kafka 连接器和 raw format 作为 value.format。

Raw format 连接器是内置的,不需要添加额外的连接器依赖。

使用Raw格式

比如在 Kafka 中有以下原始日志数据,希望使用 Flink SQL 读取和分析此类数据。

47.29.201.179 - - [28/Feb/2019:13:17:10 +0000] "GET /?p=1 HTTP/2.0" 200 5316 "https://domain.com/?p=1" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36" "2.75"

下面的代码创建了一张表,使用 raw format 以 UTF-8 编码的形式从中读取(也可以写入)底层的 Kafka topic 主题数据为字符串:

CREATE TABLE nginx_log (
log STRING
) WITH (
'connector' = 'kafka',
'topic' = 'nginx_log',
'properties.bootstrap.servers' = 'localhost:9092',
'properties.group.id' = 'testGroup',
'format' = 'raw'
)

将原始数据读取为纯字符串,之后使用用户自定义函数将其分为多个字段进行进一步分析。例如示例中的 my_split。

SELECT t.hostname, t.datetime, t.url, t.browser, ...
FROM
(
SELECT my_split(log) as t FROM nginx_log
)
;

相对应的,也可以将一个字符串类型的列以 UTF-8 编码的形式写入 Kafka topic。

Format 参数

参数是否必选默认值类型描述
format必选(none)String指定要使用的格式, 这里应该是 raw
raw.charset可选UTF-8String指定字符集来编码文本字符串。
raw.endianness可选big-endianString指定字节序来编码数字值的字节。有效值为 big-endianlittle-endian 。更多细节可查阅字节序

数据类型映射

下表详细说明了这种格式支持的 SQL 类型,包括用于编码和解码的序列化类和反序列化类的详细信息。

Flink SQL 类型
CHAR / VARCHAR / STRINGUTF-8(默认)编码的文本字符串。
编码字符集可以通过 raw.charset 进行配置。
BINARY / VARBINARY / BYTES字节序列本身。
BOOLEAN表示布尔值的单个字节,0表示 false, 1 表示 true。
TINYINT有符号数字值的单个字节。
SMALLINT采用big-endian(默认)编码的两个字节。
字节序可以通过 raw.endianness 配置。
INT采用 big-endian (默认)编码的四个字节。
字节序可以通过 raw.endianness 配置。
BIGINT采用 big-endian (默认)编码的八个字节。
字节序可以通过 raw.endianness 配置。
FLOAT采用 IEEE 754 格式和 big-endian (默认)编码的四个字节。
字节序可以通过 raw.endianness 配置。
DOUBLE采用 IEEE 754 格式和 big-endian (默认)编码的八个字节。
字节序可以通过 raw.endianness 配置。
RAW通过 RAW 类型的底层 TypeSerializer 序列化的字节序列。