Pyspark-将数据框列的值提供给功能,并将功能输出附加到原始数据框

时间:2020-05-26 17:55:57

标签: dataframe pyspark pyspark-dataframes utm

我有一个PYSPARK数据框df,其值为'latitude'和'longitude':

+---------+---------+
| latitude|longitude|
+---------+---------+
|51.822872| 4.905615|
|51.819645| 4.961687|
| 51.81964| 4.961713|
| 51.82256| 4.911187|
|51.819263| 4.904488|
+---------+---------+

我想从数据框列中获取UTM坐标(“ x”和“ y”)。为此,我需要将pyproj的值“经度”和“纬度”提供给以下函数。然后,结果“ x”和“ y”应附加到原始数据帧df中。这就是我在熊猫上做的事情:

from pyproj import Proj
pp = Proj(proj='utm',zone=31,ellps='WGS84', preserve_units=False)
xx, yy = pp(df["longitude"].values, df["latitude"].values)
df["X"] = xx
df["Y"] = yy

我将如何在Pyspark中做到这一点?

1 个答案:

答案 0 :(得分:2)

使用pandas_udf,向函数提供一个数组,然后也返回一个数组。见下文:

from pyspark.sql.functions import array, pandas_udf, PandasUDFType
from pyproj import Proj
from pandas import Series

@pandas_udf('array<double>', PandasUDFType.SCALAR)
def get_utm(x):
  pp = Proj(proj='utm',zone=31,ellps='WGS84', preserve_units=False)
  return Series([ pp(e[0], e[1]) for e in x ])

df.withColumn('utm', get_utm(array('longitude','latitude'))) \
  .selectExpr("*", "utm[0] as X", "utm[1] as Y") \
  .show()