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

奥马尔

我正在使用 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

当然,这显然是错误的方法,因为可能存在其他带有脏字符的字段,也可能存在其他脏字符。

所以问题是:

  1. 我认为 Parquet(或 avro,或其他二进制格式)不关心字段内的字符是否错误?
  2. 难道我做错了什么?
  3. 我怎样才能防止这种问题?

谢谢

HakkiBuyukcengiz

答案:

  1. 你错了。Parquet 不受内部分隔符(例如换行符或制表符等)的影响。
  2. 不。实际上,您的数据存储在与oracle 中相同的parquet 文件中。然而; 当您将数据打印到屏幕上时,根据您的客户端(假设您使用 hive 客户端),您会看到结果已损坏,因为服务器很可能以明文形式向客户端发送数据。
  3. 为了防止这种情况,在打印数据时,您可以使用 hive 的功能:regexp_replace(your_text_column, "\t|\n|\r\n", " ")这将防止您的客户“混淆”。

此外,您不必对包含此类特定字符的数据使用镶木地板。我认为 hive 的默认分隔符 (\001) 就足够了。该非打印字符不太可能出现在文本字段中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Sqoop导入时处理Hive表中的分区

Cloudera sqoop 在导入时将某些列映射到空值

使用--query argumrnt导入sqoop

使用sqoop导入Hive时获取文件存在错误

matlab:使用 readmatrix 导入时转换 CSV 列中的值

如果使用Sqoop将数据从MySql导入HDFS,HDFS中存储的文件格式是什么?

在使用本地JSON文件导入时找不到模块

使用这些导入时要编译哪些Google jar文件

如何使用Sqoop Java API导入数据?

无法使用Sqoop从Mysql导入表

使用phpmyadmin导入时mysql中的自动增量列

在OpenTK中,使用Assimp导入时,多个网格不会变形

为什么sqoop在导入时抛出错误?

sqoop导入时的部分和重复记录

Sqoop根据列值导入as-parquetfile

SQOOP导入失败,找不到文件异常

从shell中的sqoop导入捕获结果代码

使用sqoop需要将查询结果导入到hive表中

如何确保使用sqoop导入的数据在配置单元中遵循与mysql表相同的行顺序

使用限定符导入时,无法将导入类型用作 QML 中的属性类型

Sqoop导入--password文件功能在sqoop 1.4.4中无法正常工作

使用 Impala 查询 HDFS 中的 Parquet 文件

使用Sparklyr读取Databricks中的Parquet文件

使用 to_parquet 函数创建的 dask parquet 文件结构

从定界文件导入时,mysqlimport NULL值

使用控制字符作为分隔符的 Sqoop 导入

不能使用sqoop将数据表导入hbase

使用Sqoop将数据从MySQL导入到Hive

使用sqoop将mysql表导入hdfs时出错