如何在 PySpark 中使用列值作为字典的键?

Pet*_*ter 5 python dataframe apache-spark apache-spark-sql pyspark

我有一个小的 PySpark DataFrame df

index    col1
0        1    
1        3
2        4
Run Code Online (Sandbox Code Playgroud)

还有一本字典:

LOOKUP = {0: 2, 1: 5, 2: 5, 3: 4, 4: 6}
Run Code Online (Sandbox Code Playgroud)

我现在想col2向 中添加一个额外的列df,等于LOOKUP的值col1

我的输出应该是这样的:

index    col1 col2
0        1    5    
1        3    4
2        4    6
Run Code Online (Sandbox Code Playgroud)

我尝试使用:

df = df.withColumn(col("col2"), LOOKUP[col("col1")])
Run Code Online (Sandbox Code Playgroud)

但这给了我错误,以及使用expr.

如何在 PySpark 中实现这一点?

bla*_*hop 6

您可以使用map从字典创建的列lookup

from itertools import chain
from pyspark.sql import functions as F

lookup = {0: 2, 1: 5, 2: 5, 3: 4, 4: 6}
lookup_map = F.create_map(*[F.lit(x) for x in chain(*lookup.items())])

df1 = df.withColumn("col2", lookup_map[F.col("col1")])

df1.show()
#+-----+----+----+
#|index|col1|col2|
#+-----+----+----+
#|    0|   1|   5|
#|    1|   3|   4|
#|    2|   4|   6|
#+-----+----+----+
Run Code Online (Sandbox Code Playgroud)

lookup_df另一种方法是从字典创建一个然后与您的数据框连接