使用sqoop导入时Parquet文件中的脏值

bhmjp9jg  于 2021-06-01  发布在  Hadoop
关注(0)|答案(1)|浏览(297)

我使用sqoop1(版本1.4.6,cdh5.7.4)从oracle导入。
sqoop创建了一个临时Parquet配置单元表,然后我使用配置单元(直线)来 insert into 目标表。
这种双步骤摄取是由于目标表与sqoop表有不同的列类型Map,因此 insert into 我可以在飞行中转换它们。我也在快速压缩。这是正确的。目前,我没有控制sqoop的import命令上的类型Map。在我的特殊情况下太复杂了。
一开始我是在flatfile中导入的,但是我有一些字段,其中包含了一堆打断行的字符,比如换行符、回车符、制表符等等。出于这个和其他原因,我决定转向parquet(不幸的是,avro不是一个选项,因为我们使用的工具不支持它)。
在我看来,像parquet这样的二进制格式在处理这些字符时不会有问题。
原来我错了。
select * from table 显示了一些损坏的行,经过大量调试,我发现一些字段被分成两部分。我可以看到一个被截断的记录(根据oracle的源代码),其中一部分在另一行中(单独)。因为我在sqoop中使用自由形式查询,所以解决方案是在提取时使用replace函数替换字符 REPLACE(REPLACE(REPLACE(note, chr(10), ' '), chr(13), ' '), chr(09), ' ') AS NOTE .
当然,这显然是错误的方法,因为可能有其他字段有脏字符,也可能有其他脏字符。
所以问题是:
我是否错误地认为parquet(或avro,或其他二进制格式)不关心字段中的字符?
我做错什么了吗?
我怎样才能防止这种问题?
谢谢

uqjltbpv

uqjltbpv1#

答案:
你错了。Parquet不受内部分隔符字符(如换行符或制表符等)的影响。
不。事实上,您的数据存储在parquet文件中,和存储在oracle文件中一样。然而;当您将数据打印到屏幕上时,根据您的客户机(假设您使用的是hive客户机),您会看到结果被破坏,因为服务器很可能以明文形式将数据发送到客户机。
为了防止这种情况,在打印数据时,可以使用配置单元的功能: regexp_replace(your_text_column, "\t|\n|\r\n", " ") . 这将防止你的客户的“困惑”。
另外,对于包含这些特定字符的数据,不必使用parquet。我认为配置单元的默认分隔符(\001)就足够了。非打印字符很少出现在文本字段中。

相关问题