【问题标题】:PySpark UDF for converting UTM error expected zero arguments for construction of ClassDict (for numpy.dtype)PySpark UDF 用于转换 UTM 错误预期零参数用于构造 ClassDict(用于 numpy.dtype)
【发布时间】:2020-07-25 17:51:58
【问题描述】:

我正在尝试在 PySpark 中创建一个 UDF,用于将 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)

谢谢

【问题讨论】:

    标签: apache-spark pyspark user-defined-functions


    【解决方案1】:

    主要问题是将 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)
    

    【讨论】:

      猜你喜欢
      • 2021-07-31
      • 2019-05-16
      • 1970-01-01
      • 2016-11-09
      • 2015-07-06
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      相关资源
      最近更新 更多