序列化SDO_地理类型的文本真的很慢



我正在尝试通过Microsoft Azure Data Factory(Gen2(将SDO_GEOMETRY记录从Oracle表中提取SDO_GEOMETRY记录。我的选择语句看起来像:

select t.MY_GEOM.get_WKT() from my_table t

其中my_geom列是类型sdo_geometry。它有效,但确实非常慢。大约2个小时通过此方法提取74000个记录。没有这种转换(因此,没有.get_wkt()的普通选择大约需要32秒,但是结果当然是垃圾和无法使用的。

是否有一些方法可以加快流程?我的猜测是问题在服务器端,但我不是DBA,也无法直接访问它。我可以通过SQL开发人员或数据工厂连接到它。

包含的数据只有一些linestring(x1 y1,x2 y2,...(

我还尝试运行SDO_UTIL.TO_WKTGEOMETRY转换它,但同样慢。

如果您有任何建议,请告诉我。

亲切的问候,都铎

,据我所知,ADF中的数据源或汇中不会施加其他负担,因此,使用get_WKT()方法,这是DB侧的性能瓶颈。

当然,您可以参考此链接中的调整指南以提高转移性能。尤其是对并行副本。对于每个复制活动运行,Azure Data Factory确定用于从源数据存储和目标数据存储复制数据的并行副本的数量。

我在搜索不同的方法时找到了一个不错的解决方案。如上所述,该解决方案对我有效,包括两个步骤:

  1. 通过以下选择语句
  2. 将SDO_GEOMETRY LINESTRING分配到其坐标中
SELECT t.id, nt.COLUMN_VALUE AS coordinates, rownum FROM my_table t, TABLE(t.SDO_GEOMETRY.SDO_ORDINATES) nt 

我只是在Azure Data Factory的普通复制活动中使用它,将我的原始文件作为CSV将其保存到数据湖中。这些文件很大,大约比下一步创建的最终版本大4倍

  1. 通过某些数据标准scala Spark Code
  2. 将坐标汇总回一个字符串
val mergeList = udf { strings: Seq[String] => strings.mkString(", ") } 
val result = df.withColumn("collected", 
     collect_list($"coordinates").over(Window.partitionBy("id").orderBy("rownum")) 
  ) 
  .groupBy("id") 
  .agg(max($"collected").as("collected")) 
  .withColumn("final_coordinates", mergeList($"collected")) 
  .select("id", "final_coordinates")
val outputFilePrefix = s"$dataLakeFolderPath/$tableName"
val tmpOutputFolder = s"$outputFilePrefix.tmp"
result
  .coalesce(1)
  .write
  .option("header", "true")
  .csv(tmpOutputFolder)
dbutils.fs.cp(partition_path, s"$outputFilePrefix.csv")
dbutils.fs.rm(tmpOutputFolder, recurse = true)

final_coordinates列以适当的顺序包含我的坐标(我对此有一些问题(。我可以清楚地将文件保存回我的存储帐户。最后,我只保留我感兴趣的适当的CSV文件。

正如我说的,这很快。我的第一步大约需要2.5分钟,而第二步则需要几秒钟,而第二个则需要2个小时,所以我对此解决方案感到非常满意。

最新更新