Pyspark - передать значения столбца фрейма данных в функцию и добавить вывод функции в исходный фрейм данных - PullRequest
1 голос
/ 26 мая 2020

У меня есть df фрейма данных PYSPARK со значениями «широта» и «долгота»:

+---------+---------+
| 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. Вот как я сделал это в Pandas:

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 Ответ

2 голосов
/ 26 мая 2020

Используйте 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()
...