我正在使用 Sqoop1(版本 1.4.6,CDH 5.7.4)从 Oracle 导入。
Sqoop 创建一个临时 Parquet Hive 表,然后我使用 Hive(直线)到insert into
目标表。
这种双步摄取是因为目标表具有与 Sqoop 不同的列类型映射,因此insert into
我可以即时转换它们。我也在 Snappy 中即时压缩。这工作正常。目前,我没有控制 Sqoop 的导入命令上的类型映射。在我的特殊情况下它太复杂了。
一开始我是在平面文件中导入的,但是我有包含一堆字符的字段,这些字符会破坏我的行,如换行符、回车符、制表符等。由于这个和其他原因,我决定转向 Parquet(不幸的是,avro 不是一个选项,因为我们使用的工具不支持它)。
在我看来,像 Parquet 这样的二进制格式在处理这些字符时不会有问题。
原来我错了。
Aselect * from table
显示了一些损坏的行,经过大量调试后,我发现某些字段被分成两部分。我能够看到被截断的记录(根据 Oracle 来源),其中一部分位于另一行(单独)。由于我在 Sqoop 中使用自由格式查询,因此解决方案是在提取时使用替换函数替换字符REPLACE(REPLACE(REPLACE(note, chr(10), ' '), chr(13), ' '), chr(09), ' ') AS NOTE
。
当然,这显然是错误的方法,因为可能存在其他带有脏字符的字段,也可能存在其他脏字符。
所以问题是:
谢谢
答案:
regexp_replace(your_text_column, "\t|\n|\r\n", " ")
。这将防止您的客户“混淆”。此外,您不必对包含此类特定字符的数据使用镶木地板。我认为 hive 的默认分隔符 (\001) 就足够了。该非打印字符不太可能出现在文本字段中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句