如何在Databricks PySpark中用Apache Sedona将Parquet经纬度转为几何点
解决方案
方法1:使用PySpark API(修复函数未导入问题)
你需要先导入Apache Sedona为PySpark提供的空间函数模块,st_makePoint属于sedona.sql.st_functions,未导入会触发"未定义"错误。修改代码如下:
# 导入必要的函数 from sedona.sql.st_functions import st_makePoint, st_setSRID from pyspark.sql.functions import col # 读取数据(保留你的原有代码) rawDf = sedona.read.format("parquet").load("s3://PATH_TO_MY_PARQUET_DATA") # 生成geometry点列 df = rawDf.withColumn("geometry", st_makePoint(col("longitude"), col("latitude"))) # 可选:为几何列指定坐标系(常用WGS84即EPSG:4326,后续空间操作需统一坐标系) df = df.withColumn("geometry", st_setSRID(col("geometry"), 4326))
方法2:使用SQL语句(适配你已创建的临时视图)
如果你更习惯SQL语法,可直接通过Spark SQL生成几何列,无需额外导入函数:
# 读取数据并创建临时视图(保留你的原有代码) rawDf = sedona.read.format("parquet").load("s3://PATH_TO_MY_PARQUET_DATA") rawDf.createOrReplaceTempView("rawdf") # 执行SQL生成geometry列 df = spark.sql(""" SELECT *, ST_MakePoint(longitude, latitude) AS geometry FROM rawdf """) # 可选:指定坐标系 df = spark.sql(""" SELECT *, ST_SetSRID(ST_MakePoint(longitude, latitude), 4326) AS geometry FROM rawdf """)
额外优化建议(针对100TB大数据量)
- 保留Parquet数据的原有分区结构,避免全量重分区带来的性能损耗。
- 后续执行空间查询前,可对
geometry列创建空间索引,大幅提升点-in-多边形等操作的效率。
内容的提问来源于stack exchange,提问作者Maryam_Kh
相关产品推荐
相关产品推荐

