【问题标题】:Sqoop not able to map oracle column types to hive columnSqoop 无法将 oracle 列类型映射到 hive 列
【发布时间】:2016-02-04 16:31:44
【问题描述】:

我将一堆 Oracle 10g 表放入 hive。我正在集群上使用 Hortonworks HDP2.3。 其中一个包含 100 多列的 oracle 表有一个 ROW_ID 列,我发现它的类型是 oracle.sql.ROWID。 Sqoop 抛出错误:

2016-02-04 16:09:19,746 ERROR - [main:] ~ Cannot resolve SQL type -8 (ClassWriter:645)
2016-02-04 16:09:19,747 ERROR - [main:] ~ Cannot resolve SQL type -8 (ClassWriter:645)
2016-02-04 16:09:19,747 ERROR - [main:] ~ No Java type for SQL type -8 for column ROW_ID (ClassWriter:718)
2016-02-04 16:09:19,748 ERROR - [main:] ~ No Java type for SQL type -8 for column ROW_ID (ClassWriter:718)
2016-02-04 16:09:19,749 ERROR - [main:] ~ No Java type for SQL type -8 for column ROW_ID (ClassWriter:798)
2016-02-04 16:09:19,756 ERROR - [main:] ~ Got exception running Sqoop: java.lang.NullPointerException (Sqoop:181)
java.lang.NullPointerException
        at org.apache.sqoop.orm.ClassWriter.parseNullVal(ClassWriter.java:1377)
        at org.apache.sqoop.orm.ClassWriter.parseColumn(ClassWriter.java:1402)
        at org.apache.sqoop.orm.ClassWriter.myGenerateParser(ClassWriter.java:1528)
        at org.apache.sqoop.orm.ClassWriter.generateParser(ClassWriter.java:1491)
        at org.apache.sqoop.orm.ClassWriter.generateClassForColumns(ClassWriter.java:1920)
        at org.apache.sqoop.orm.ClassWriter.generate(ClassWriter.java:1736)
        at org.apache.sqoop.tool.CodeGenTool.generateORM(CodeGenTool.java:107)
        at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:478)
        at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:605)
        at org.apache.sqoop.Sqoop.run(Sqoop.java:143)
        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
        at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:179)
        at org.apache.sqoop.Sqoop.runTool(Sqoop.java:218)
        at org.apache.sqoop.Sqoop.runTool(Sqoop.java:227)
        at org.apache.sqoop.Sqoop.main(Sqoop.java:236)

有没有办法将此 oracle 列类型映射到任何 hive 列类型或只是使其成为字符串?

【问题讨论】:

  • 基本上,Oracle ROWID 存储特定文件块上特定行的逻辑位置。随着时间的推移,相同的 ROWID 可能会引用不同的行 (旧的被删除,空闲空间在插入时被重用) 或者同一行可能会移动到新的 ROWID (表碎片整理等.) 换句话说,对用户数据使用 ROWID 类型是绝对的变态
  • 感谢参孙的信息。我不是甲骨文的人,所以不知道 ROWID 是什么意思。我也永远不会在我的业务逻辑中使用它。只是想在配置单元中维护表定义尽可能接近源。将问题标题更新为更通用的标题,因为答案仍然与 Sqoop 用户相关。
  • 我不怪你,你只是“运输者” ;-) 无论如何,ROWID 本质上是二进制的,因此运输它的安全方法是将其转换为 Hex 或 Base64字符串。

标签: hive sqoop hortonworks-data-platform


【解决方案1】:

好的,不确定这是否是正确的做法。但无论如何。

首先我尝试了--map-column-hive ROW_ID=String,它仍然在抱怨同样的错误。

然后我尝试了--map-column-java ROW_ID=String,它很高兴地从oracle下载了数据,但还没有准备好放到hive中:

2016-02-04 16:55:17,655 ERROR - [main:] ~ Encountered IOException running import job: java.io.IOException: Hive does not support the SQL type for column ROW_ID
        at org.apache.sqoop.hive.TableDefWriter.getCreateTableStmt(TableDefWriter.java:181)
        at org.apache.sqoop.hive.HiveImport.importTable(HiveImport.java:188)
        at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:514)
        at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:605)
        at org.apache.sqoop.Sqoop.run(Sqoop.java:143)
        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
        at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:179)
        at org.apache.sqoop.Sqoop.runTool(Sqoop.java:218)
        at org.apache.sqoop.Sqoop.runTool(Sqoop.java:227)
        at org.apache.sqoop.Sqoop.main(Sqoop.java:236)
 (ImportTool:613)

嗯,最后他们的组合很好用。

sqoop import .... --map-column-java ROW_ID=String --map-column-hive ROW_ID=String

另外,--split-by 也不喜欢 ROW_ID。所以我不得不为此使用不同的列。

-干杯。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 2020-05-02
    • 2016-05-06
    • 1970-01-01
    相关资源
    最近更新 更多