Pyspark—将dataframe列的值提供给函数,并将函数的输出附加到原始dataframe

Pyspark—将dataframe列的值提供给函数,并将函数的输出附加到原始dataframe,dataframe,pyspark,pyspark-dataframes,utm,Dataframe,Pyspark,Pyspark Dataframes,Utm,我有一个PYSPARK数据帧df,其值为“纬度”和“经度”: +---------+---------+ | latitude|longitude| +---------+---------+ |51.822872| 4.905615| |51.819645| 4.961687| | 51.81964| 4.961713| | 51.82256| 4.911187| |51.819263| 4.904488| +---------+---------+ 我想从dataframe列中获取UTM坐

我有一个PYSPARK数据帧df,其值为“纬度”和“经度”:

+---------+---------+
| latitude|longitude|
+---------+---------+
|51.822872| 4.905615|
|51.819645| 4.961687|
| 51.81964| 4.961713|
| 51.82256| 4.911187|
|51.819263| 4.904488|
+---------+---------+
我想从dataframe列中获取UTM坐标('x'和'y')。要做到这一点,我需要从pyproj将值'longitude'和'latitude'提供给下面的函数。然后,结果“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中如何执行此操作?

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

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.sql.functions导入数组、pandas\u udf、PandasUDFType
从pyproj导入项目
从熊猫进口系列
@pandas_udf('array',PandasUDFType.SCALAR)
def get_utm(x):
pp=Proj(Proj='utm',zone=31,ellps='WGS84',preserve_units=False)
返回序列([pp(e[0],e[1]),用于x中的e])
df.withColumn('utm',get_utm(数组('longitude','latitude'))\
.选择EXPR(“*”,“utm[0]作为X”,“utm[1]作为Y”)\
.show()

我在
df.withColumn('utm',get_utm(数组('longitude','latitude'))\)中得到了各种错误。选择expr(“*”,“utm[0]作为X”,“utm[1]作为Y”)
例如:-Python worker无法连接回。-java.net.SocketTimeoutException:Accept超时是否有其他方法或这些错误是否值得解决?@Jeroen,关于pandas_udf和pyarrow版本存在已知问题,请参阅链接:。如果不是同一个问题,你能发布错误吗?我检查了我的Pyspark版本,它是v2.4.5,pyarrow版本是0.13。根据链接,我不得不降级到版本0.10,我做到了。我查看了conda列表,它显示了Pyarrow的0.10版本。但是现在我得到了错误:
ImportError:PyArrow>=0.8.0必须安装;但是,它没有找到。
你能给我你的PyArrow和PyArrow版本吗?我接受了答案,但仍然没有解决PyArrow问题。这个周末我会进一步调查。