Hive load外部文件时如何区别分隔符与文本内容
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive load外部文件时如何区别分隔符与文本内容相关的知识,希望对你有一定的参考价值。
参考技术A在测试hive的load性能时,我们在建表时指定使用 | 作为分隔符。这样就需要考虑一个问题:如果外部文本中 | 作为文本内容出现时,如何区分到底是分隔符还是文本内容。
首先测试hive是否能智能区分分隔符与文本内容,结果表明:当分隔符与文本内容相同时,会产生数据混淆问题。
SQL如何解决这一问题
参考链接: 如何在sqlldr中导入多字符分隔符文件
SQL中对此的解决办法是采用多字符分隔符,以降低产生数据混淆的概率。
Hive中对这一问题的解决思路与SQL相同
然而hive中默认只支持单字符分割符,如果指定多字符分隔符将会报错。
参考链接: hive如何处理多分隔符数据
hive处理日志,自定义inputformat
hive创建表指定分隔符,不支持多个字符作为分隔符
解决办法:
1. 利用hive自带的序列化/反序列化的方式RegexSe
这种方式稍微复杂一点,对数据的控制能力也要弱一些,它使用正则表达式来匹配和处理数据,性能也会有所影响。但它的优点是可以自定义表属性信息 SERDEPROPERTIES ,在 SerDe 中通过这些属性信息可以有更多的定制行为。
2. 自定义 outputformat 和 inputformat
Hive 的 outputformat/inputformat 与 hadoop 的 outputformat/inputformat 相当类似, inputformat 负责把输入数据进行格式化,然后提供给 Hive,outputformat 负责把 Hive 输出的数据重新格式化成目标格式再输出到文件,这种对格式进行定制的方式较为底层,对其进行定制也相对简单,重写 InputFormat 中 RecordReader 类中的 next 方法即可。
Hive内部表和外部表的区别
1、Hive内部表和外部表区别:主要分为两方面,数据加载load、删除表drop。
数据加载:创建内部表时,会将数据移动到hive指向的路径,并且由hive来管理数据的生命周期。
创建外部表时,只是记录数据所在的路径,不对数据位置做改变。
删除表:删除内部表,数据和元数据会一起删除掉。
删除外部表,只是删除元数据,数据不会删除。
2、如何选择内部表还是外部表:
a、所有数据都由hive管理,就创建内部表;数据由hive和其他工具一起管理,就创建外部表。
b、管理表不方便获取数据的权限,数据由其他工具管理,选用外部表。
以上是关于Hive load外部文件时如何区别分隔符与文本内容的主要内容,如果未能解决你的问题,请参考以下文章