首页 > 大数据 > > Spark SQL 和 Hive 数据类型
在使用Spark交互过程中经常会出现一个需要面对问题,就不系统之间数据之间转换和映射。数据类型的映射和转换是一个不可避免的问题 。 同样的,在Spark SQL连接 Hive 的场景下, Catalyst 中定义的数据类型与 Hive 中的数据类型间的互相转换是一个重要的需求 。
在 SparkSQL 的 Hive 模块下,由 Hivelnspectors 负责 Catalyst 与 Hive 数据类型的转换,具体包括 4 个方面的功能 。
数据类型(Data Type )到 Objectlnspector 的映射过程,在 Hivelnspectors 中由 to Inspee-tor(dataType: DataType )方法完成。 直观上看,也比较容易确定彼此的关系。例如, Catalyst中的 MapType 数据类型,对应 Hive 中的 StandardMapObjectlnspector 对象 。目 前版本的 DataType 与 Objectlnspector 对象的对应关系如表所示。 在模式匹配过程中, Objectlnspector 统一从Hive 的 ObjectinspectorFactory 工厂类获得。

从 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”的函数。该方法严格遵循以下顺序 。

总的来讲,目前 Spark SQL 与 Hive 之间的 数据映射转换在功能上除不支持 Hive 中的Hive Varch ar/HiveChar 类型和 Union 类型外,基本能够满足各种场景的需求。 从代码实现层面来看 ,后续的 Spark 版本规划中将会优化整体实现方式 ,以及一些特殊情形的处理。 例如,函数date_add(printf(“ %s- %s - %s’: a,b,c), 3 )就不需要进行数据的 unwrapping 和 wrapping 操作。
Hive 中的数据类型比较完善,不仅支持基本的数据类型,还支持集合数据类型(如 Map 、Struct 和 Array 等) 。 SerDe 是 Hive 中用来实现数据序列化和反序列化的框架, SerDe 层构建在数据存储和执行引擎之间,能够实现数据存储与执行引擎之间的解捕 。 SerDe 体系中提供了一个辅助类 Objectlnspector ,可帮助使用者访问需要序列化或反序列化的对象。
Hive当前使用这些 SerDe 类去序列化和反序列化数据:
另外:
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31509949/viewspace-3168187/ ,如需转载,请注明出处,否则将追究法律责任。