PySpark:如何解决';python工作程序无法连接回';在UDF中使用pyproj包时出错?(将lat/long坐标转换为UTM坐标)

PySpark:如何解决';python工作程序无法连接回';在UDF中使用pyproj包时出错?(将lat/long坐标转换为UTM坐标),pyspark,converters,pyspark-dataframes,Pyspark,Converters,Pyspark Dataframes,我有一个带有lat/long坐标的json文件,我试图在PySpark中将其转换为UTM(“x”,“y”)。 .json文件如下所示: {"positionmessage":{"latitude": 51.822872161865234,"longitude": 4.905614852905273}} {"positionmessage":{"latitude": 51.819644927978516, "longitude": 4.961687088012695}} 我在pyspark中读取

我有一个带有lat/long坐标的json文件,我试图在PySpark中将其转换为UTM(“x”,“y”)。 .json文件如下所示:

{"positionmessage":{"latitude": 51.822872161865234,"longitude": 4.905614852905273}}
{"positionmessage":{"latitude": 51.819644927978516, "longitude": 4.961687088012695}}
我在pyspark中读取json文件,并尝试使用以下脚本在pyspark中转换为UTM('x','y'-coord):

import numpy as np
from pyspark.sql import SparkSession
from pyspark.sql.types import ArrayType, StructField, StructType, StringType, IntegerType, DateType, FloatType, TimestampType, DoubleType
from pyspark.sql.functions import *

appName = "PySpark"
master = "local"
file_name = "lat_lon.JSON"

# Create Spark session
spark = SparkSession.builder \
    .appName(appName) \
    .master(master) \
    .getOrCreate()

schema = StructType([
    StructField("positionmessage",
    StructType([
    StructField('latitude', DoubleType(), True),
    StructField('longitude', DoubleType(), True),
    ]))])

df  = spark.read.schema(schema).json(file_name).select("positionmessage.*")
在这里之前没有问题;当我尝试使用pyproj包(在Pandas中工作)转换为UTM坐标时,问题就出现了

从pyspark.sql.functions导入数组、pandas\u udf、PandasUDFType
从pyproj导入项目
从熊猫进口系列
#使用decorator“pandas\u udf”包装函数。
@pandas_udf('array',PandasUDFType.SCALAR)
def get_utm(x):
pp=Proj(Proj='utm',zone=31,ellps='WGS84',preserve_units=False)
返回序列([pp(e[0],e[1]),用于x中的e])
df=df.withColumn('utm',get_utm(数组('longitude','latitude'))\
.选择EXPR(“*”,“utm[0]作为X”,“utm[1]作为Y”)
df.show()

我发现了一个问题:“python worker无法重新连接”,但代码本身似乎没有问题。有什么问题吗

您可以使用普通自定义项而不是熊猫自定义项:

@udf(returnType=ArrayType(DoubleType()))
def get_utm(long, lat):
  pp = Proj(proj='utm', zone=31, ellps='WGS84', preserve_units=False)
  return pp(long, lat)


result = df.withColumn('utm', get_utm('longitude','latitude')).selectExpr("*", "utm[0] as X", "utm[1] as Y")

这给了我一个错误:“/”无法解析pyspark 2.4.5中给定输入列的“
positionmessage
”[纬度,经度]”。此外,我想在代码中输入“纬度”和“经度”(我还有其他列名).我的错,我没有注意到您选择了经度和纬度作为输入。我已编辑并测试了我的答案。
@udf(returnType=ArrayType(DoubleType()))
def get_utm(long, lat):
  pp = Proj(proj='utm', zone=31, ellps='WGS84', preserve_units=False)
  return pp(long, lat)


result = df.withColumn('utm', get_utm('longitude','latitude')).selectExpr("*", "utm[0] as X", "utm[1] as Y")