Python 在pyspark中将列传递给when函数

Python 在pyspark中将列传递给when函数,python,apache-spark,pyspark,pyspark-sql,pyspark-dataframes,Python,Apache Spark,Pyspark,Pyspark Sql,Pyspark Dataframes,我有两个pyspark数据帧: 第一个数据帧:工厂 +-----+--------+ |plant|station | +-----+--------+ |Kech | st1 | |Casa | st2 | +-----+--------+ +-------+--------+ |program|station | +-------+--------+ |pr1 | null| |pr2 | st1 | +-------+-----

我有两个pyspark数据帧:

第一个数据帧:工厂

 +-----+--------+
 |plant|station |
 +-----+--------+
 |Kech |    st1 |
 |Casa |    st2 |
 +-----+--------+
 +-------+--------+
 |program|station |
 +-------+--------+
 |pr1    |    null|
 |pr2    |    st1 |
 +-------+--------+
第二个数据帧:站点

 +-----+--------+
 |plant|station |
 +-----+--------+
 |Kech |    st1 |
 |Casa |    st2 |
 +-----+--------+
 +-------+--------+
 |program|station |
 +-------+--------+
 |pr1    |    null|
 |pr2    |    st1 |
 +-------+--------+
我想要的是用第一个数据帧中的所有列站替换第二个数据帧站中的空值。像这样:

+-------+--------------+
|program|station       |
+-------+--------------+
|pr1    |    [st1, st2]|
|pr2    |    st1       |
+-------+--------------+
我这样做:

stList = plants.select(F.col('station')).rdd.map(lambda x: x[0]).collect()
stations = stations.select(
                    F.col('program')
                    F.when(stations.station.isNull(), stList).otherwise(stations.station).alias('station')
)
但是当不接受python列表作为参数时,它会给我一个错误
F.lit(str(stList))
这应该行得通。 要获得更好的类型转换,请使用下面提到的代码

stations = stations.select(
                    F.col('program'),
                    F.when(stations.station.isNull(), func.array([func.lit(x) for x in stList]))
.otherwise(func.array(stations.station)).alias('station')
)


谢谢你的回复

通过将列转换为pandas,我找到了解决方案

stList = list(plants.select(F.col('station')).toPandas()['station'])
然后使用:

F.when(stations.station.isNull(), F.array([F.lit(x) for x in station])).otherwise(stations['station']).alias('station')

它直接给出一个数组。

首先,您不能在station列中保留不同的数据类型,它需要保持一致

+-------+--------------+
|program|station       |
+-------+--------------+
|pr1    |    [st1, st2]| # this is array
|pr2    |    st1       | # this is string
+-------+--------------+
第二,这应该可以做到:

从pyspark.sql导入函数为F
#将stList创建为字符串。
stList=“,”.join(plants.select(F.col('station')).rdd.map(lambda x:x[0]).collect())
#合并变量,然后应用pyspark.sql.functions.split函数
stations=(stations.select)(
F.col(“程序”),
F.split(F.coalesce(stations.station,F.lit(stList)),“,”)。别名('station'))
电台节目
输出:

+-------+----------+
|program|   station|
+-------+----------+
|    pr1|[st1, st2]|
|    pr2|     [st1]|
+-------+----------+