
# Raw Format
#### 功能描述
Raw format 允许读写原始（基于字节）值作为单个列。
![](https://support.huaweicloud.com/sqlref-flink-dli/public_sys-resources/note_3.0-zh-cn.png)
- Raw Format将 null 值编码成 byte\[\] 类型的 null。这样在 upsert-kafka 中使用时可能会有限制，因为 upsert-kafka 将 null 值视为 墓碑消息（在键上删除）。因此，如果该字段可能具有 null 值，我们建议避免使用 upsert-kafka 连接器和 raw format 作为 value.format。
- Raw format 连接器是内置的。更多具体使用可参考开源社区文档：[Raw Format](https://nightlies.apache.org/flink/flink-docs-release-1.15/zh/docs/connectors/table/formats/raw/)。
 
#### 支持的Connector
- Kafka
- Upsert Kafka
- Filesystem
 
#### 参数说明
表1 
| 参数             | 是否必选 | 默认值        | 类型     | 描述                                               |
|:---|:---|:---|:---|:---|
| format         | 是    | (none)     | String | 指定要使用的格式, 这里应该是 'raw'。                           |
| raw.charset    | 否    | UTF-8      | String | 指定字符集来编码文本字符串。                                   |
| raw.endianness | 否    | big-endian | String | 指定字节序来编码数字值的字节。有效值为'big-endian'和'little-endian'。 |
   
#### 数据类型映射
下表详细说明了这种格式支持的 SQL 类型，包括用于编码和解码的序列化类和反序列化类的详细信息。
表2数据类型映射 
| Flink SQL 类型               | 值                                                                   |
|:---|:---|
| CHAR / VARCHAR / STRING    | UTF-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 序列化的字节序列。                               |
   
#### 示例
使用kafka发送数据，输出到print中。
1. 根据kafka所在的虚拟私有云和子网创建相应的跨源，并绑定所要使用的队列。然后设置安全组，入向规则，使其对当前将要使用的队列放开，并根据kafka的地址测试队列连通性（通用队列 \> 找到作业的所属队列 \> 更多 \> 测试地址连通性 \> 输入kafka的地址 \> 测试）。如果能连通，则表示跨源已经绑定成功；否则表示未成功。
2. 创建flink opensource sql作业，选择flink1.15，并提交运行，其代码如下： 
   ```
   CREATE TABLE kafkaSource (
     log string
   ) WITH (
     'connector' = 'kafka',
     'topic' = 'kafkaTopic',
     'properties.bootstrap.servers' = 'KafkaAddress1:KafkaPort,KafkaAddress2:KafkaPort',
     'properties.group.id' = 'GroupId',
     'scan.startup.mode' = 'latest-offset',
     'format' = 'raw'
   );
   CREATE TABLE printSink (
     log string
   ) WITH (
     'connector' = 'print'
   );
   insert into printSink select * from kafkaSource;
   ```
   
   
3. 向kafka的相应topic中插入下列数据： 
   ```
   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"
   ```
   
   
4. 按照如下方式查看taskmanager.out文件中的数据结果： 
   1. 登录DLI管理控制台，选择"作业管理 \> Flink作业"。
   
   2. 单击对应的Flink作业名称，选择"运行日志"，单击"OBS桶"，根据作业运行的日期，找到对应日志的文件夹。
   
   3. 进入对应日期的文件夹后，找到名字中包含"taskmanager"的文件夹进入，下载获取.out文件查看结果日志。
   
   
   ```
   +I[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"]
   ```
   
   
 
