0
我正在將一堆Oracle 10g表映射到配置單元中。我正在使用集羣上的Hortonworks HDP2.3。 其中一個超過100列的oracle表有一個ROW_ID列,我發現它的類型爲oracle.sql.ROWID。 Sqoop拋出錯誤:Sqoop無法將oracle列類型映射到配置單元列
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列類型映射到任何蜂房列類型或只讓字符串?
基本上,Oracle ROWID爲特定文件塊上的特定行存儲*邏輯位置*。隨着時間的推移,相同的ROWID可能會引用不同的行*(舊的被刪除,可用空間被重用於插入)*或同一行可能被移動到新的ROWID *(表碎片整理等)*換句話說, **對用戶數據使用ROWID類型是一種絕對且徹底的變態**。 –
謝謝你的參考Samson。我不是Oracle的人,所以不知道ROWID是什麼意思。我從來不會在業務邏輯中使用它。只是希望儘量保持蜂巢表格定義儘可能接近源代碼。將問題標題更新爲更通用的問題,因爲答案仍然與Sqoop用戶有關。 –
我不怪你,你只是「運輸者」;-)無論如何,ROWID本質上是二進制的,所以運輸它的安全方式是將其轉換爲十六進制或Base64字符串。 –