在pysparkDataframe中从lat long中查找状态名

q43xntqr  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(307)

我有一个 pyspark 包含大量行的Dataframedf。其中一列是lat long。我想从lat long中找到州名。我使用下面的代码

import reverse_geocoder as rg
new_df = df_new2.toPandas()
list_long_lat = a["lat_long"].tolist() 
result = rg.search(list_long_lat)
state_name=[]
for each_entry in result:
    state_name.append(each_entry["admin2"])
state_values = pd.Series(state_name)
a.insert(loc=0, column='State_name', value=state_values)

首先,当转换到pandas时,我遇到了内存不足的问题。考虑到输入Dataframe中的行数是多少,有没有任何方法可以在不从pysparkDataframe转换到pandasDataframe的情况下有效地找到状态名huge:1000000 million

dddzy1tm

dddzy1tm1#

你能试着创建一个自定义项吗

import reverse_geocoder as rg
import pyspark.sql.functions as f
map_state = f.udf(lambda x : rg.search(x)[0]['admin2'])
data.withColumn('State',map_state(f.col('lat_long'))).show()

这里唯一的缺点是udf不是很快,而且这会多次命中api。

nzkunb0c

nzkunb0c2#

没有做太多的pyspark,但是pyspark的语法有点类似于pandas。也许可以试试下面的片段。

search_state_udf = udf(lambda x: rg.search(x), StringType())

df.withColumn("state", search_state_udf(df.lat_long))

当数据集超过1m条记录时,循环整个数据集通常不起作用,您可能需要看看 apply 为了提高效率。

相关问题