如何实现Flink、Iceberg和Hive数据类型之间的互转

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定义

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值