摘要
- 简介部分ETL过程中使用avro格式的优越性
- 此文章主要记录ETL过程使用avro格式存储数据时的注意事项
简介
出于方便性考虑, 数据仓库ods层的存储格式往往是text
text是易于人类阅读的, 当然易于以字符串的形式批量处理数据.
但是如果数据源是mysql等关系型数据库, 数据本身的格式相对规范. 这种情况下, 数据抽取时如果依旧使用text格式, 必然会导致数据类型信息的丢失.
此外, text格式无法存储null值, 字符串的"null"和空值难以区分
如果对数据安全有较高需求, text格式的低应激特性也会带来隐患.
Apache Avro是一个独立于编程语言的数据序列化系统, avro对数据类型要求严格, 一旦数据类型出现异常, 以avro格式存储的hive表会显式的抛出异常, 以此来提醒运维人员.
所以考录将数据存储格式更改为avro.
使用
需要用sqoop将数据导出为avro格式, 可以指定--as-avrodatafile
kettle中, 转换 -> 核心对象 -> Big Data -> Avro Output
流程, 也可以将数据导出为avro
问题
当数据从传统的关系型数据库, 比如mysql, 被导出为avro, 再被导入hive时, 实际上会发生两次数据类型的转换.
这是因为mysql, avro, hive各有不同的数据类型, 导出和导入过程都不可避免的需要转换数据类型.
而且当数据类型对应错误, hive在尝试读取对应avro文件时就会抛出异常.
总而言之, 数据格式的对应是一个必然要注意到的细节.
avro到hive的数据类型转换, 实际上并不太需要我们操心, 因为在hive建表时, 可以指定了"a