ITPub博客

首页 > 大数据 > > Spark SQL 和 Hive 数据类型

Spark SQL 和 Hive 数据类型

作者:格伯纳 时间:2020-05-12 12:05:11 0 删除 编辑

在使用Spark交互过程中经常会出现一个需要面对问题,就不系统之间数据之间转换和映射。数据类型的映射和转换是一个不可避免的问题 。 同样的,在Spark SQL连接 Hive 的场景下, Catalyst 中定义的数据类型与 Hive 中的数据类型间的互相转换是一个重要的需求 。

在 SparkSQL 的 Hive 模块下,由 Hivelnspectors 负责 Catalyst 与 Hive 数据类型的转换,具体包括 4 个方面的功能 。

  • 数据解封( Data Unwrapping ),将 Hive 中的数据类型转换为 Catalyst 中的数据类型,称为unwrap 操作 。
  • 数据封装( Data Wrapping ),将 Catalyst 中的数据类型转换为 Hive 中的数据类型,为wrap 操作 。
  • 将 Catalyst 中的数据绑定相应的 Objectinspector 对象,对应 tolnspector 操作 。
  • 从 Objectlnspector 对象中提取 Catalyst 数据,对应 inspectorToDataType 操作 。

DataTypeTolnspector 与 Data Wrapping

数据类型(Data Type )到 Objectlnspector 的映射过程,在 Hivelnspectors 中由 to Inspee-tor(dataType: DataType )方法完成。 直观上看,也比较容易确定彼此的关系。例如, Catalyst中的 MapType 数据类型,对应 Hive 中的 StandardMapObjectlnspector 对象 。目 前版本的 DataType 与 Objectlnspector 对象的对应关系如表所示。 在模式匹配过程中, Objectlnspector 统一从Hive 的 ObjectinspectorFactory 工厂类获得。

图 1.0 Catalyst 数据类型对应的 Hive Objectlnspector

InspectorToDataType 与 Data Unwrapping

从 Hive 数据转换为 Spark SQL 中的数据对应数据的解封装,具体有两种操作,第一种是能够根据 Hive 中的 Objectlnspector 确定 Spark SQL 中的数据类型,第二种是能够根据 Hive 中的Objectlnspector 得到数据解封装函数。.

从 Objectinspector 确定 DataType 的逻辑很简单, 直接枚举所有情况即可,具体实现参见

inspectorToDataType 方法。 Objectlnspector 与 Data Type 的映射关系。 可见, 一种DataType 一般对应两种 Objectlnspecto r 对象,例如 F loatType 对应的WritableFloatObjectlnspector和 JavaFloatObjectlnspector 对象。数据的解封装操作本质上是对 Objectlnspector 对象的解封装操作,在 Hivelnspectors 中实现为 unwrapper For( objectlnspector: Objectlnspector )方法,返回类型同样是“Any=> Any”的函数。该方法严格遵循以下顺序 。

图 1.1 Hive Objectlnspector 与 DataType 的映射关系
  1. 常量 ( ConstantO bje ctlnspector )且为 null ,返回 null 。
  2. 常量 ( ConstantObjectlnspector ),根据 Objectlnspector 提取其中的数据。
  3. 如果 Objectlnspector 倾向于获取 Writable 类型( preferWritable ),那么首先得到 Writable类型的数据, 然后转换为 Catalyst 中的数据,否则直接由 Objectlnspector 得到 Java 数据类型 。

总的来讲,目前 Spark SQL 与 Hive 之间的 数据映射转换在功能上除不支持 Hive 中的Hive Varch ar/HiveChar 类型和 Union 类型外,基本能够满足各种场景的需求。 从代码实现层面来看 ,后续的 Spark 版本规划中将会优化整体实现方式 ,以及一些特殊情形的处理。 例如,函数date_add(printf(“ %s- %s - %s’: a,b,c), 3 )就不需要进行数据的 unwrapping 和 wrapping 操作。

Hive 数据类型与 SerDe 框架

Hive 中的数据类型比较完善,不仅支持基本的数据类型,还支持集合数据类型(如 Map 、Struct 和 Array 等) 。 SerDe 是 Hive 中用来实现数据序列化和反序列化的框架, SerDe 层构建在数据存储和执行引擎之间,能够实现数据存储与执行引擎之间的解捕 。 SerDe 体系中提供了一个辅助类 Objectlnspector ,可帮助使用者访问需要序列化或反序列化的对象。

Hive当前使用这些 SerDe 类去序列化和反序列化数据:

  • MetadataTypedColumnsetSerDe:这个 SerDe 用于读取/写入带分隔符的记录,如CSV、TSV、^A分隔的记录(对不起,还不支持引号)。
  • LazySimpleSerDe:该SerDe可用于读取与MetadataTypedColumnsetSerDe和TCTLSeparatedProtocol相同的数据格式,但是,它以一种惰性的方式创建对象,从而提供更好的性能。从Hive 0.14.0开始,它还支持使用指定的编码字符集读写数据,例如ALTER TABLE person SET SERDEPROPERTIES ('serialization.encoding'='GBK');
  • 如果将属性 hive.lazysimple.extended_boolean_literal 设置为true (Hive 0.14.0和更高版本),LazySimpleSerDe可以将’T’、‘t’、‘F’、‘f’、'1’和’0’视为扩展的合法布尔文本。这个属性默认值为false,这意味着只有’TRUE’和’FALSE’被视为合法的布尔文字。
  • ThriftSerDe:这个SerDe用于读写Thrift序列化对象。必须首先加载Thrift对象的类文件。
  • DynamicSerDe:这个SerDe也可以读写Thrift序列化的对象,但是它能够理解Thrift DDL,所以可以在运行时提供对象的模式。它还支持许多不同的协议,包括TBinaryProtocol、TJSONProtocol、TCTLSeparatedProtocol(它在分隔的记录中写入数据)。

另外:

  • 对于JSON文件,在Hive 0.12.0中添加了JsonSerDe。Amazon SerDe可以在s3://elasticmapreduce/samples/hive-ads/libs/jsonserde.jar中获得,用于0.12.0之前的版本。
  • 在Hive 0.9.1中添加了Avro SerDe。 从Hive 0.14.0开始,其规范隐含在STORED AS AVRO子句中。
  • 在Hive 0.11.0中添加了ORC文件格式的SerDe。
  • Parive的SerDe通过Hive 0.10中的插件添加,并在Hive 0.13.0中原生添加。
  • 在Hive 0.14中添加了支持 CSV 的SerDe。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31509949/viewspace-3168187/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
管理员

注册时间:2018-03-30

  • 博文量
    2383
  • 访问量
    984338