Blink 漫谈系列 - 数据类型

本文涉及的产品
实时计算 Flink 版,5000CU*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轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
目录
相关文章
|
6月前
|
存储 关系型数据库 MySQL
TiDB中的数据类型详解
【2月更文挑战第29天】TiDB支持多种数据类型:整数(TINYINT到BIGINT)、浮点(FLOAT, DOUBLE)、定点(DECIMAL)、字符串(CHAR, VARCHAR, TEXT)、日期时间(DATE, TIME, DATETIME, TIMESTAMP)、二进制(BINARY, VARBINARY, BLOB)以及枚举和集合(ENUM, SET)。正确选择数据类型对存储、查询和性能至关重要。
1037 1
|
6月前
|
SQL Java 分布式数据库
Flink CDC HBase字段类型与Flink SQL类型之间的转换
【1月更文挑战第4天】【1月更文挑战第19篇】Flink CDC HBase字段类型与Flink SQL类型之间的转换
134 1
|
4月前
|
SQL 流计算
实时计算 Flink版操作报错合集之怎么向一个未定义列的表中写入数据
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
5月前
|
关系型数据库 MySQL Java
实时计算 Flink版操作报错合集之udf是怎么定义接收和返回的数据类型的
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
6月前
|
存储 数据库 流计算
Flink CDC 3.0 对于字符串类型的切片键(sharding key)确实存在一些问题
【2月更文挑战第29天】Flink CDC 3.0 对于字符串类型的切片键(sharding key)确实存在一些问题
47 5
|
6月前
|
Oracle 关系型数据库 MySQL
flink cdc 转换问题之类型转换如何解决
Flink CDC(Change Data Capture)是一个基于Apache Flink的实时数据变更捕获库,用于实现数据库的实时同步和变更流的处理;在本汇总中,我们组织了关于Flink CDC产品在实践中用户经常提出的问题及其解答,目的是辅助用户更好地理解和应用这一技术,优化实时数据处理流程。
|
6月前
|
存储 Oracle 关系型数据库
Flink CDC在处理数据时,会将字段名转换为小写
【2月更文挑战第15天】Flink CDC在处理数据时,会将字段名转换为小写
156 3
|
6月前
|
SQL 监控 Java
Flink报错问题之Flink sql tinyint类型使用in报错如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
|
6月前
|
存储 SQL 数据库
Flink CDC 数据源问题之数值不匹配如何解决
Flink CDC数据源指的是使用Apache Flink的CDC特性来连接并捕获外部数据库变更数据的数据源;本合集将介绍如何配置和管理Flink CDC数据源,以及解决数据源连接和同步过程中遇到的问题。
112 1
|
存储 SQL HIVE
数据仓库的Hive的数据类型的复杂数据类型的map
在数据仓库领域,Hive是一个常用的工具。它提供了一种简单的方式来查询和分析大量数据。
163 0