PySpark UDF для преобразования ошибки UTM, ожидаемые нулевые аргументы для построения ClassDict (для numpy .dtype) - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь создать UDF в PySpark для преобразования UTM в долготу и широту.

Ошибка

Caused by: net.razorvine.pickle.PickleException: expected zero arguments for construction of ClassDict (for numpy.dtype)

Пробовал с другим типом данных, но без любая удача.

Код PySpark

import pyspark.sql.functions as F
from pyspark.sql.types import *
import utm

df2 = spark.createDataFrame([(531086, 6224626), (531086, 6224626)], ["C1", "C2"])
df2.printSchema()

utm_udf_x = F.udf(lambda x,y: utm.to_latlon(x,y, 32, 'U')[0], ArrayType(FloatType()))
utm_udf_y = F.udf(lambda x,y: utm.to_latlon(x,y, 32, 'U')[1], ArrayType(FloatType()))

df2 = df2.withColumn('lat',utm_udf_x(F.col('C1'), F.col('C2')))
df2 = df2.withColumn('lon',utm_udf_y(F.col('C1'), F.col('C2')))

display(df2)

Спасибо

1 Ответ

0 голосов
/ 13 апреля 2020

Основной проблемой было преобразование Numpy DType в форму с плавающей точкой utm.to_latlon.

Это работает

import pyspark.sql.functions as F
from pyspark.sql.types import *
import utm

df2 = spark.createDataFrame([(340000.0, 5710000.0), (573014.00000135, 6221529.99974406)], ["C1", "C2"])
df2.printSchema()

utm_udf_x = F.udf(lambda x,y: float(utm.to_latlon(x,y, 32, 'U')[0]), FloatType())
utm_udf_y = F.udf(lambda x,y: float(utm.to_latlon(x,y, 32, 'U')[1]), FloatType())

df2 = df2.withColumn('lat',utm_udf_x(F.col('C1'), F.col('C2')))
df2 = df2.withColumn('lon',utm_udf_y(F.col('C1'), F.col('C2')))

display(df2)
...