我正在使用 Apache Spark v3.0.1 和 Apache Sedona v1.1.1,我正在尝试将 Shapefile 读入SpatialRDD
. 我首先尝试了Sedona 库提供的示例(更具体地说,是testShapefileConstructor
方法内部的代码),它确实有效。但是,当我尝试读取另一个 Shapefile 时,尽管元数据已正确加载,但实际数据却丢失了。使用count
在SpatialRDD
给我0。
我正在使用的 shapefile 可在此处获得。这是巴西一个州的地图。由于我尝试使用其他州的数据,我猜这些文件有问题。
这是我使用的代码。我知道 shapefile 的内容位于带有 、 和 文件的文件夹中.shp
,因此.shx
该文件夹的变量。.dbf
.prj
path
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")
所以我仍然不知道为什么无法阅读。可能是什么问题?