0

我将 geospark(sedona) 与 pyspark 一起使用:是否可以从 Oracle 读取 sdo_geometry 类型并在 Oracle 中使用 sdo_Geometry 字段写入表?在我的应用程序中:我能够阅读:

db_table = "(SELECT sdo_util.to_wktgeometry(geom_32632) geom FROM  geodss_dev.CATASTO_GALLERIE cg WHERE rownum <10)"  <---Query on Oracle Db 
df_oracle = spark.read.jdbc(db_url, db_table, properties=db_properties)
df_oracle.show()
df_oracle.printSchema()

但是当我写:

df_oracle.createOrReplaceTempView("gallerie")
df_write=spark.sql("select ST_AsBinary(st_geomfromwkt(geom)) geom_32632 from gallerie") <--query with Sedona Library on tempView Gallerie
print(df_write.dtypes)
df_write.write.jdbc(db_url, "geodss_dev.gallerie_test", properties=db_properties,mode="append")

我有这个错误:

ORA-00932: inconsistent data types: expected MDSYS.SDO_GEOMETRY, got BINARY

有写 sdo_geometry 类型的解决方案吗?感谢和问候

4

1 回答 1

0

您正在阅读序列化格式的几何图形:第一个示例中的 WKT(文本),第二个示例中的 WKB(二进制)。

如果要将它们写回 SDO_GEOMETRY 对象,则需要将它们反序列化。这可以通过两种方式完成:

  • 使用 SDO_GEOMETRY 构造函数:

insert into my_table(my_geom) values (sdo_geometry(:wkb))

或者

insert into my_table(my_geom) values (sdo_geometry(:wkt))

  • 使用显式转换函数:

insert into my_table(my_geom) values (sdo_util.from_wkbgeometry(:wkb))

或者

insert into my_table(my_geom) values (sdo_util.from_wktgeometry(:wkt))

我不知道如何使用 geospark 来表达这一点。我认为它确实允许您指定要写入的列列表和输入值列表等内容?

绝对不会发生从序列化格式(二进制或文本)到几何对象的自动转换。除了旧的 WKT 和 WKB 之外,实际上还有许多序列化格式:GML 和 GeoJSON 是主要的替代方案。但是这两个需要显式调用转换函数。

编辑:关于你的第二个例子:而不是堆叠两个函数调用,你可以这样做:

SELECT sdo_util.to_wkbgeometry(geom_32632) geom ...

此外,在这两个示例中,您都可以使用对象方法而不是函数调用。结果将是相同的(无论如何,方法只是调用相同的函数),但语法更紧凑。重要提示:这需要使用别名!。

SELECT cg.geom_32632.get_wkt() geom 
FROM geodss_dev.CATASTO_GALLERIE cg 
WHERE rownum <10
SELECT cg.geom_32632.get_wkb() geom 
FROM geodss_dev.CATASTO_GALLERIE cg 
WHERE rownum <10
于 2022-03-04T10:43:11.813 回答