问题
我使用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
答案 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不支持所有RDBMS数据类型。
如果不支持特定的数据类型,您将收到如下错误:
SQL类型没有Java类型.....
<强>解决方案强>
在sqoop命令中添加--map-column-java
。
语法:--map-column-java col-name=java-type,...
例如,--map-column-java col1=String,col2=String
您需要上面提到的--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_GEOJSON、SDO_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,这种方法也可以扩展到其他可用的空间函数。