Pyspark - 将数据框列的值馈送到函数并将函数的输出附加到原始数据框
Pyspark - feed values of dataframe column to function and append output of function to original dataframe
我有一个 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')。为此,我需要将值 'longitude' 和 'latitude' 提供给 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 中执行此操作?
使用 pandas_udf,为函数提供一个数组,然后 return 也提供一个数组。见下文:
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()
我有一个 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')。为此,我需要将值 'longitude' 和 'latitude' 提供给 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 中执行此操作?
使用 pandas_udf,为函数提供一个数组,然后 return 也提供一个数组。见下文:
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()