如何使用PySpark解码GEOHASH列获取经纬度
如何在PySpark中通过pygeohash解码Geohash获取经纬度?
我尝试使用pygeohash库将Geohash解码为纬度(Latitude)和经度(Longitude),代码如下:
import pygeohash as pgh from pyspark.sql.types import StringType udf1 = udf(lambda x: pgh.decode(x)) add_latlong = add.withColumn('location', udf1(col('GEOHASH')))
但执行后得到的结果中,location列显示为对象数组的引用,而非实际经纬度值:
+------------+--------------------+ | GEOHASH| location| +------------+--------------------+ |w284nyv39qzn|[Ljava.lang.Objec...| |w0zqyr64nt4v|[Ljava.lang.Objec...| |w2815pb0yfgr|[Ljava.lang.Objec...| |w281xv1czv1t|[Ljava.lang.Objec...| |w2r7cvc0m1bz|[Ljava.lang.Objec...| +------------+--------------------+
我曾尝试在UDF中指定StringType作为返回类型,但结果依旧如此。请问该如何从中提取出实际的纬度和经度?
已验证的解决方案
通过指定UDF的返回类型为ArrayType(FloatType),可以正确解析经纬度数组,再通过索引拆分出纬度和经度列。完整代码及结果如下:
from pyspark.sql.types import ArrayType, FloatType udf1 = udf(lambda x: pgh.decode(x), ArrayType(FloatType())) add_latlong = add.withColumn('location', udf1(col('GEOHASH')))\ .withColumn('Lat', col('location')[0])\ .withColumn('Long', col('location')[1])
执行后的数据框结果:
+------------+--------------------+--------+----------+ | GEOHASH| location| lat| long| +------------+--------------------+--------+----------+ |w2864utg8uyf|[3.189408, 101.73...|3.189408| 101.73035| |w281hj25hzre|[3.017675, 101.42...|3.017675|101.425995| |w2830hj8vzrp|[3.010423, 101.60...|3.010423|101.609375| |w0zf5uepz8uk|[4.596367, 101.06...|4.596367| 101.06768| |w2rkk6s97gvt|[2.167289, 111.63...|2.167289| 111.63843| +------------+--------------------+--------+----------+
内容的提问来源于stack exchange,提问作者Sarah Rahman
相关产品推荐
相关产品推荐

