0

我正在使用 Apache Spark v3.0.1 和 Apache Sedona v1.1.1,我正在尝试将 Shapefile 读入SpatialRDD. 我首先尝试了Sedona 库提供的示例(更具体地说,是testShapefileConstructor方法内部的代码),它确实有效。但是,当我尝试读取另一个 Shapefile 时,尽管元数据已正确加载,但实际数据却丢失了。使用countSpatialRDD给我0。

我正在使用的 shapefile 可在此处获得。这是巴西一个州的地图。由于我尝试使用其他州的数据,我猜这些文件有问题。

这是我使用的代码。我知道 shapefile 的内容位于带有 、 和 文件的文件夹中.shp,因此.shx该文件夹的变量。.dbf.prjpath

import org.apache.sedona.viz.core.Serde.SedonaVizKryoRegistrator
import org.apache.sedona.core.formatMapper.shapefileParser.ShapefileReader
import org.apache.sedona.sql.utils.{Adapter, SedonaSQLRegistrator}
import org.apache.sedona.viz.sql.utils.SedonaVizRegistrator
import org.apache.spark.serializer.KryoSerializer
import org.apache.spark.sql.{SparkSession, DataFrame, Encoder}

object Main {

def main(args: Array[String]) {
    val spark = SparkSession.builder
      .config("spark.master", "local[*]")
      .config("spark.serializer", classOf[KryoSerializer].getName)
      .config("spark.kryo.registrator", classOf[SedonaVizKryoRegistrator].getName)
      .appName("test")
      .getOrCreate()

    SedonaSQLRegistrator.registerAll(spark)
    SedonaVizRegistrator.registerAll(spark)

    val path = "/path/to/shapefile/folder"
    val spatialRDD = ShapefileReader.readToGeometryRDD(spark.sparkContext, path)
    println(spatialRDD.fieldNames)
    println(spatialRDD.rawSpatialRDD.count())
    var rawSpatialDf = Adapter.toDf(spatialRDD, spark)
    rawSpatialDf.show()
    rawSpatialDf.printSchema()
  }
}

输出:

[ID, CD_GEOCODM, NM_MUNICIP]
0
+--------+---+----------+----------+
|geometry| ID|CD_GEOCODM|NM_MUNICIP|
+--------+---+----------+----------+
+--------+---+----------+----------+
root
 |-- geometry: geometry (nullable = true)
 |-- ID: string (nullable = true)
 |-- CD_GEOCODM: string (nullable = true)
 |-- NM_MUNICIP: string (nullable = true)

我尝试更改字符编码,如此处所指出的但在这些尝试之后结果是相同的:

System.setProperty("sedona.global.charset", "utf8")

System.setProperty("sedona.global.charset", "iso-8859-1")

所以我仍然不知道为什么无法阅读。可能是什么问题?

4

0 回答 0