我一直在尝试将 GeoPandas 数据框转换为 PySpark 数据框,但没有成功。目前,我已经扩展了 DataFrame 类以将 GPD DF 转换为 Spark DF,如下所示:
from pyspark.sql import DataFrame
from pyspark.sql.types import IntegerType, StringType, FloatType, BooleanType, DateType, TimestampType, StructField, StructType
!pip install geospark
from geospark.sql.types import GeometryType
class SPandas(DataFrame):
def __init__(self, sqlC, objgpd):
esquema = dict(objgpd.dtypes)
equivalencias = {'int64' : IntegerType, 'object' : StringType, 'float64' : FloatType,
'bool' : BooleanType, 'datetime64' : DateType,
'timedelta' : TimestampType, 'geometry' : GeometryType}
for clave, valor in esquema.items():
try:
esquema[clave] = equivalencias[str(valor)]
except KeyError:
esquema[clave] = StringType
esquema = StructType([ StructField(v, esquema[v](), False) for v in esquema.keys() ])
datos = sqlC.createDataFrame(objgpd, schema=esquema)
super(self.__class__, self).__init__(datos._jdf, datos.sql_ctx)
前面的代码编译没有错误,但是当尝试从 DataFrame 中“获取”一个项目时,我收到以下错误:
fp = "Paralela/Barrios/Barrios.shp"
map_df = gpd.read_file(fp)
mapa_sp = SPandas(sqlC, map_df)
mapa_sp.take(1)
Py4JJavaError: An error occurred while calling o21.applySchemaToPythonRDD.
: java.lang.ClassNotFoundException: org.apache.spark.sql.geosparksql.UDT.GeometryUDT
问题在于 GDP DF 的“几何”列,因为没有它它可以完美运行。'geometry' 列具有 Shapely Polygon 对象,这些对象应被 GeoSpark 的 GeometryType 类识别。
有没有办法安装 org.apache.spark.sql.geosparksql.UDT.GeometryUDT?我正在使用谷歌 Colab。