mysql sqoop 中的特殊字符导入为文本和 Parquet 文件

Special characters in mysql sqoop import as Text and Parquet file

我有 1000 个 table,每个 table 在 mysql 中有超过 100000 条记录。 table 有 300-500 列。 table 中的某些列的列名称中包含特殊字符,例如 .(点)和 space。

现在我想在 HDFS 中进行 sqoop 导入并创建一个配置单元 table,如下所示,作为文本文件

sqoop import --connect ${domain}:${port}/$(database) --username ${username} --password ${password} --table $(table) -m 1 --hive-import --hive-database ${hivedatabase} --hive-table $(table) --create-hive-table --target-dir /user/hive/warehouse/${hivedatabase}.db/$(table)

在此之后创建配置单元 table 但是当我在 table 上执行 select * 查询时它显示错误为

此错误输出是示例输出。

Error while compiling statement: FAILED: RuntimeException java.lang.RuntimeException: cannot find field emp from [0:emp.id, 1:emp.name, 2:emp.salary, 3:emp.dno]

然而,当我导入为 parquet 文件时,会创建 table,当我执行 select 查询时,查询会给出预期的结果。甚至 .(dot) 也会自动替换为 _(underscore)

为什么会这样?

这是因为你在列名中有那些特殊字符,它不会在 parquet 中发生,因为 SQOOP 正在将列名转换为有效的 java 标识符(例如,java 不' 允许标识符中有空格)。解决方法是我们将字符 ` 到 select 你的第 1 到 1

select
`.(dot)`
from yourtable.

让我知道它是否有效。

以上原因是由于Hive的限制。在配置单元中,他们禁用了在列名称中使用 dot/colon 的配置单元表的创建。

他们在 https://issues.apache.org/jira/browse/HIVE-10120

有一个 Jira