在 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)
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}