【问题标题】:How can i import a column type SDO_GEOMETRY from Oracle to HDFS with Sqoop?如何使用 Sqoop 将列类型 SDO_GEOMETRY 从 Oracle 导入 HDFS?
【发布时间】:2017-09-02 10:15:39
【问题描述】:

问题

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

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

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

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

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

错误 :
ERROR tool.ImportTool: Encountered IOException running import job: java.io.IOException: Hive does not support the SQL type for column 形状

SQOOP 命令

下面是我的 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

【问题讨论】:

    标签: hadoop hive hdfs sqoop bigdata


    【解决方案1】:

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

    在您的 sqoop 作业中使用以下参数

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

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

    因为你的列名是 Shape

    --map-column-java Shape=String
    

    【讨论】:

    • 当我尝试 --map-column-java columnNameforSDO_GEOMETRY=String 时,我收到异常说“对于列 SHAPE,SQL 类型 2002 没有 Java 类型”
    • --map-column-java Shape=String ..试试这个
    • 我收到此错误“错误工具。ImportTool:遇到 IOException 运行导入作业:java.io.IOException:Hive 不支持列 SHAPE 的 SQL 类型”
    • 你能分享你的导入命令吗?只需在你的问题中更新它
    • 仅在您的命令中使用 --map-column-hive,因为它是一个配置单元导入
    【解决方案2】:

    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类型,并在对应的hive类型中进行转换:

     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

    【讨论】:

    • 我试过 --map-column-hive 但我仍然收到错误:错误 orm.ClassWriter: 无法解析 SQL 类型 2002 17/04/07 00:47:42 错误 orm.ClassWriter: 否列的 SQL 类型 2002 的 Java 类型。错误 sqoop.Sqoop:运行 Sqoop 时出现异常:java.lang.NullPointerException java.lang.NullPointerException at org.apache.sqoop.orm.ClassWriter.parseNullVal(ClassWriter.java:1377)跨度>
    【解决方案3】:

    对于通过 SQOOP 将 SDO GEOMETRY 从 Oracle 导入 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,这种方法也可以扩展到其他可用的空间功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-12
      • 1970-01-01
      相关资源
      最近更新 更多