Sqoop 导出几何列:错误 orm.ClassWriter:SQL 类型 1111 没有 Java 类型(postgresql 几何点 3945)

问题描述 投票:0回答:1

在 CDP 集群 (hdfs) 上使用 Sqoop 导出,我正在尝试将数据几何导出到 Postgresql 表,但我面临 Sqoop 错误 orm.ClassWriter:列“geom”的 SQL 类型 1111 没有 Java 类型。

PostGis 上的“geom”列定义是:geometry (Point,3945)。

这是我的 Sqoop 导出查询:

sqoop export --connect "jdbc:postgresql://$database_server/$database_source_name" \
--username $username --password $password_alias \
--table $database_table_name \
--export-dir "${DIR_OUT_HDFS}" \
--fields-terminated-by '|' --lines-terminated-by "\n" \
-- --schema $database_table_name  1>>${LOG_FILE} 2>>${LOG_FILE}

这里是Sqoop输出错误:

ERROR orm.ClassWriter: No Java type for SQL type 1111 for column geom
ERROR sqoop.Sqoop: Got exception running Sqoop: java.lang.NullPointerException
java.lang.NullPointerException
    at org.apache.sqoop.orm.ClassWriter.parseColumn(ClassWriter.java:1417)
    at org.apache.sqoop.orm.ClassWriter.myGenerateParser(ClassWriter.java:1555)
    at org.apache.sqoop.orm.ClassWriter.generateParser(ClassWriter.java:1518)
    at org.apache.sqoop.orm.ClassWriter.generateClassForColumns(ClassWriter.java:1979)
    at org.apache.sqoop.orm.ClassWriter.generate(ClassWriter.java:1764)
    at org.apache.sqoop.tool.CodeGenTool.generateORM(CodeGenTool.java:106)
    at org.apache.sqoop.tool.ExportTool.exportTable(ExportTool.java:77)
    at org.apache.sqoop.tool.ExportTool.run(ExportTool.java:113)
    at org.apache.sqoop.Sqoop.run(Sqoop.java:151)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:81)
    at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:187)
    at org.apache.sqoop.Sqoop.runTool(Sqoop.java:241)
    at org.apache.sqoop.Sqoop.runTool(Sqoop.java:250)
    at org.apache.sqoop.Sqoop.main(Sqoop.java:259)
postgresql geometry postgis sqoop cloudera-cdp
1个回答
0
投票

The error message "No ResultSet method for Java type java.lang.Object" that you're seeing when running Sqoop export suggests that Sqoop is encountering an issue with mapping the  geom column to a Java data type.

一个可能的解决方案是使用特定的 Java 库来实现处理此对象类型的必要方法。例如,如果

geom
列包含 Well-Known Binary (WKB) 等格式的空间数据,您可以尝试使用 JTS(Java 拓扑套件)或 GeoTools 等 Java 库将 WKB 数据转换为更有用的格式,然后再使用 Sqoop 将其导出。

这是一个示例,说明如何修改脚本以使用 GeoTools 库来处理

geom
专栏:

#!/bin/bash
    
    # Set up variables
    database_server="localhost"
    database_source_name="mydatabase"
    database_table_name="mytable"
    username="myusername"
    password_alias="mypasswordalias"
    DIR_OUT_HDFS="/user/hive/warehouse/mytable_export"
    LOG_FILE="export.log"
    
    # Convert the WKB data in the geom column to a string representation using GeoTools
    sqoop eval \
      --connect "jdbc:postgresql://$database_server/$database_source_name" \
      --username $username --password $password_alias \
      --query "SELECT ST_AsText(geom) FROM $database_table_name LIMIT 1" \
      | awk '{print $1}' \
      > /tmp/geom.txt
    
    # Export the data using Sqoop, passing the output from GeoTools as the value for the --map-column-java option
    sqoop export \
      --connect "jdbc:postgresql://$database_server/$database_source_name" \
      --username $username --password $password_alias \
      --table $database_table_name \
      --export-dir "${DIR_OUT_HDFS}" \
      --fields-terminated-by '|' --lines-terminated-by "\n" \
      --map-column-java geom=java.lang.String \
      --input-null-string "" --input-null-non-string "" \
      -- --schema $database_table_name \
      1>>${LOG_FILE} 2>>${LOG_FILE}
© www.soinside.com 2019 - 2024. All rights reserved.