Blink 漫谈系列 - 数据类型-阿里云开发者社区

开发者社区> 阿里云实时计算Flink> 正文
登录阅读全文

Blink 漫谈系列 - 数据类型

简介:

Blink任务核心结构

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

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位。具体如下图:
1522969678777-89705d3c-b61f-4cc5-ba23-a4
 
  • 双精度
    double是双精度数据类型,一般在计算机中存储占用8字节,即64位,有效位是15位(不含小数点),存储结构是1位符号,11位指数,52位小数,除去全部为0的情况以外,最小为2的-52次方,Math.pow(2,-52) = 2.220446049250313E-16,约为2.22乘以10的-16次方,有效位数为16位,具体如下图:
1522969398693-d98517ee-a2a1-49a0-8652-ee
 

再说丢失精度

目前我们了解了浮点型在计算机内部的标识方式,很明显浮点型有丢失精度的可能,以示例说明:
 
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;​
 
 
输出结果:
 
克隆拷贝锚点编辑锚点删除
1523248231223-67760758-74dd-42ac-ae67-33
 
如上结果说明在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数据类型的认知,可以在后面的篇章中逐渐深入了解。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

一套基于Apache Flink构建的一站式、高性能实时大数据处理平台,广泛适用于流式数据处理、离线数据处理、DataLake计算等场景。

官方博客
链接