如何使用Sqoop将列类型SDO_GEOMETRY从Oracle导入HDFS?

时间:2017-04-07 06:32:11

标签: hadoop hive hdfs sqoop bigdata

问题

我使用Sqoop从Oracle获取数据并将其放入HDFS。与其他基本数据类型不同,我知道SDO_GEOMETRY用于空间数据。

我的Sqoop作业在获取数据类型SDO_GEOMETRY时失败。

需要帮助将带有SDO_GEOMETRY数据类型的列Shape从Oracle导入到Hdfs。

我有超过1000个具有SDO_GEOMETRY数据类型的表,如何在sqoop导入发生时处理数据类型?

我已经尝试了--map-column-java和--map-column-hive,但我仍然得到错误。

  

错误
  错误工具.ImportTool:遇到IOException正在运行导入作业:java.io.IOException:Hive不支持列的SQL类型   SHAPE

SQOOP COMMAND

下面是我的sqoop命令:

sqoop import --connect 'jdbc:oracle:thin:XXXXX/xxxxx@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=xxxxxxx)(Port=1521))(CONNECT_DATA=(SID=xxxxx)))' -m 1 --create-hive-table --hive-import --fields-terminated-by '^' --null-string '\\\\N' --null-non-string '\\\\N' --hive-overwrite --hive-table PROD.PLAN1   --target-dir test/PLAN1  --table PROD.PLAN  --map-column-hive SE_XAO_CAD_DATA=BINARY --map-column-java SHAPE=String --map-column-hive SHAPE=STRING --delete-target-dir

3 个答案:

答案 0 :(得分:0)

Sqoop在关系数据库和Hadoop之间提供的默认类型映射在您的情况下不起作用,这就是Sqoop Job失败的原因。您需要将映射覆盖为sqoop不支持的几何数据类型。

在sqoop作业中使用以下参数

  

语法: - map-column-java col1 = javaDatatype,col2 = javaDatatype .....

sqoop import
 .......
 ........
 --map-column-java columnNameforSDO_GEOMETRY=String

由于您的列名称为Shape

--map-column-java Shape=String

答案 1 :(得分:0)

Sqoop导入到HDFS

Sqoop不支持所有RDBMS数据类型。

如果不支持特定的数据类型,您将收到如下错误:

  

SQL类型没有Java类型.....

<强>解决方案

在sqoop命令中添加--map-column-java

语法:--map-column-java col-name=java-type,...

例如,--map-column-java col1=String,col2=String

Sqoop导入HIVE

您需要上面提到的--map-column-java

默认情况下,sqoop支持这些JDBC类型并在相应的配置单元类型中进行转换:

 INTEGER 
 SMALLINT 
 VARCHAR 
 CHAR 
 LONGVARCHAR 
 NVARCHAR 
 NCHAR 
 LONGNVARCHAR 
 DATE 
 TIME 
 TIMESTAMP 
 CLOB 
 NUMERIC 
 DECIMAL 
 FLOAT 
 DOUBLE 
 REAL 
 BIT 
 BOOLEAN 
 TINYINT 
 BIGINT 

如果您的数据类型不在此列表中,则会出现如下错误:

  

Hive不支持.....

的SQL类型

<强>解决方案

您需要在sqoop导入命令中添加--map-column-hive

语法:--map-column-hive col-name=hive-type,...

例如,--map-column-hive col1=string,col2='varchar(100)'

在命令中添加--map-column-java SE_XAO_CAD_DATA=String,SHAPE=String --map-column-hive SE_XAO_CAD_DATA=BINARY,SHAPE=STRING

请勿使用多个--map-column-java--map-column-hive

答案 2 :(得分:0)

对于通过 SQOOP 从 Oracle 导入 SDO GEOMETRY 到 HIVE, 将 SQOOP free form query option 与 Oracle 的 SDO_UTIL.TO_GEOJSONSDO_UTIL.TO_WKTGEOMETRY 函数一起使用。

SQOOP --query 选项允许我们添加一个 SELECT SQL QUERY,以便我们只能从表中获取所需的数据。而且,在 SQL 查询中,我们可以包含 SDO_UTIL 包函数,如 TO_GEOJSON 和 TO_WKTGEOMETRY。看起来像,

sqoop import \
...
--query 'SELECT ID, NAME, \
         SDO_UTIL.TO_GEOJSON(MYSHAPECOLUMN), \
         SDO_UTIL.TO_WKTGEOMETRY(MYSHAPECOLUMN) \
         FROM MYTABLE WHERE $CONDITIONS' \
...

这会根据函数的定义将 SDO GEOMETRY 返回为 Geojson 和 WKT 格式,并且可以直接插入到相应的 HIVE STRING 类型列中,而无需在 SQOOP 命令中进行任何其他类型映射。

根据需要选择 Geojson 和 WKT,这种方法也可以扩展到其他可用的空间函数。