2016-02-04 50 views
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列類型映射到任何蜂房列類型或只讓字符串?

+0

基本上,Oracle ROWID爲特定文件塊上的特定行存儲*邏輯位置*。隨着時間的推移,相同的ROWID可能會引用不同的行*(舊的被刪除,可用空間被重用於插入)*或同一行可能被移動到新的ROWID *(表碎片整理等)*換句話說, **對用戶數據使用ROWID類型是一種絕對且徹底的變態**。 –

+0

謝謝你的參考Samson。我不是Oracle的人,所以不知道ROWID是什麼意思。我從來不會在業務邏輯中使用它。只是希望儘量保持蜂巢表格定義儘可能接近源代碼。將問題標題更新爲更通用的問題,因爲答案仍然與Sqoop用戶有關。 –

+0

我不怪你,你只是「運輸者」;-)無論如何,ROWID本質上是二進制的,所以運輸它的安全方式是將其轉換爲十六進制或Base64字符串。 –

回答

0

好吧,不知道這是否是正確的做法。但無論如何。

首先我試過--map-column-hive ROW_ID=String,它仍然抱怨同樣的錯誤。

然後我試圖--map-column-java ROW_ID=String,它高興地從Oracle下載的數據,但還沒有準備好把它放在蜂巢:

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。所以我必須爲此使用不同的列。

-Cheers。

相關問題