Flink、Iceberg和Hive都提供了丰富的SQL 数据类型,但是在具体使用上,还是存在一些差异和不兼容的情况,当将三套引擎放在一起使用时候,经常会碰到将几种引擎的类型之间来回转换。问题是,这几套独立的数据类型是否支持互相转换,以及如何才能减轻转换的复杂性?
为此,首先需要仔细地调研几种引擎对数据类型的支持情况,现将三种引擎支持的数据类型和对应关系罗列如下:
Flink |
Iceberg |
Hive |
CHAR |
CHAR |
|
VARCHAR |
VARCHAR |
|
STRING |
string |
STRING |
BOOLEAN |
boolean |
BOOLEAN |
BINARY |
fixed(L) |
|
VARBINARY |
binary |
BINARY |
BYTES |
||
DECIMAL |
decimal(P,S) |
DECIMAL |
TINYINT |
TINYINT |
|
SMALLINT |
SMALLINT |
|
INTEGER |
int |
INT |
BIGINT |
long |
BIGINT |
FLOAT |
float |
FLOAT |
DOUBLE |
double |
DOUBLE |
DATE |
date |
DATE |
TIME |
time |
|
TIMESTAMP |
timestamp |
TIMESTAMP |
TIMESTAMP_LTZ |
timestamptz |
|
INTERVAL |
INTERVAL |
|
ARRAY |
list<E> |
array |
MULTISET |
||
MAP |
map<K, V> |
map |
ROW |
struct<...> |
struct |
RAW |
||
union |
||
Structured types |
struct<...> |
数据类型在这三种引擎之间都可以互转,但是最终存储和持久化到Hive元数据中,首先来看Hive的数据类型。
Hive将数据类型分两大类:
Complex类型:map,array ,struct,union
Primitive类型: 除Complex类型之外,如 int,float, double 等
在Hive serde库中,定义了几种类型分类:
//ObjectInspector.class
public static enum Category {
PRIMITIVE, LIST, MAP, STRUCT, UNION
};
其中Complex数据类型的使用语法格式分别为:
ARRAY<data_type>
MAP<primitive_type, data_type>
STRUCT<col_name : data_type [COMMENT col_comment], ...>
UNIONTYPE<data_type, data_type, ...>
举个建表示例:
CREATE TABLE union_test(foo UNIONTYPE<int, double, array<string>, struct<a:int,b:string>>);
每种数据类型在网络传输中都涉及到类型的序列化和反序列化,因此数据类型都有显示名称,也就是字符串表示的名字,如:
INT的显示类型名称为 int
CHAR的显示类型名称为 char
VARCHAR的显示类型名称为 varchar(length)
ARRAY的显示类型名称为 array<data_type>
MAP的显示类型名称为 map<primitive_type, data_type>
STRUCT的显示类型名称为 struct<col_name:data_type,...>
UNION的显示类型名称为uniontype<data_type, data_type, ...>
Hive serde库提供了对这些类型的序列化和反序列化方法:
//TypeInfoUtils.class
public static ArrayList<TypeInfo> getTypeInfosFromTypeString(String typeString) ;
public static List<String> getTypeStringsFromTypeInfo(List<TypeInfo> typeInfos);
举个例子,将map类型的字符串表示解析成TypeInfo类型对象表示:
ArrayList<TypeInfo> typeInfo = TypeInfoUtils.getTypeInfosFromTypeString("map<boolean,boolean>");
其中TypeInfo是Hive定义

最低0.47元/天 解锁文章
162

被折叠的 条评论
为什么被折叠?



