从 TimezoneFinder() 创建新的“时区”列,将经度和纬度列作为 PySpark 中的输入

Posted

技术标签:

【中文标题】从 TimezoneFinder() 创建新的“时区”列,将经度和纬度列作为 PySpark 中的输入【英文标题】:Create new "timezone" column from TimezoneFinder() with longitude and latitude columns as input in PySpark 【发布时间】:2021-02-16 13:26:24 【问题描述】:

我想创建一个包含等效经度和纬度的时区的新列。现有列的经度和纬度是 timezonefinder 函数的输入,即 get_timezone()。我不断收到TypeError: an integer is required (got type Column)

谢谢。

from timezonefinder import TimezoneFinder

def get_timezone(longitude, latitude):
    tzf = TimezoneFinder()
    return tzf.timezone_at(lng=longitude, lat=latitude)

location_table = location_table.withColumn("timezone", get_timezone(location_table["location_longitude"], location_table["location_latitude"]))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<command-253463262459944> in <module>
      8 
      9 # df = sqlContext.read.parquet(INPUT)
---> 10 location_table.withColumn("timezone", get_timezone(location_table["location_longitude"].cast(IntegerType()), location_table["location_latitude"].cast(IntegerType())))
     11 #   .write.parquet(OUTPUT)

<command-253463262459944> in get_timezone(longitude, latitude)
      3 def get_timezone(longitude, latitude):
      4     tzf = TimezoneFinder()
----> 5     return tzf.timezone_at(lng=longitude, lat=latitude)
      6 
      7 # udf_timezone = F.udf(get_timezone, StringType())

/databricks/python/lib/python3.7/site-packages/timezonefinder/timezonefinder.py in timezone_at(self, lng, lat)
    657         :return: the timezone name of the matched timezone polygon. possibly "Etc/GMT+-XX" in case of an ocean timezone.
    658         """
--> 659         lng, lat = rectify_coordinates(lng, lat)
    660 
    661         shortcut_id_x, shortcut_id_y = coord2shortcut(lng, lat)

TypeError: an integer is required (got type Column)

【问题讨论】:

【参考方案1】:

您需要先将函数转换为 UDF:

import pyspark.sql.functions as F
from timezonefinder import TimezoneFinder

@F.udf('string')
def get_timezone(longitude, latitude):
    if longitude is None or latitude is None:
        return None
    tzf = TimezoneFinder()
    return tzf.timezone_at(lng=longitude, lat=latitude)

location_table = location_table.withColumn("timezone", get_timezone(location_table["location_longitude"], location_table["location_latitude"]))

【讨论】:

以上是关于从 TimezoneFinder() 创建新的“时区”列,将经度和纬度列作为 PySpark 中的输入的主要内容,如果未能解决你的问题,请参考以下文章

在创建新的 Rails 应用程序时

从 XIB 创建新的 UIView 对象

无法从 xcode 创建新的配置文件

从通知启动时防止重新创建活动活动

创建新的 android 活动时出错

从每行Excel数据创建一个新的Word文档