如何使用列值作为 PySpark 中字典的键?
How to use a column value as key to a dictionary in PySpark?
我有一个小型 PySpark DataFrame df
:
index col1
0 1
1 3
2 4
还有一本字典:
LOOKUP = {0: 2, 1: 5, 2: 5, 3: 4, 4: 6}
我现在想向 df
添加一个额外的列 col2
,等于 col1
的 LOOKUP
值。
我的输出应该是这样的:
index col1 col2
0 1 5
1 3 4
2 4 6
我尝试使用:
df = df.withColumn(col("col2"), LOOKUP[col("col1")])
但这给了我错误,以及使用 expr
.
如何在 PySpark 中实现这一点?
您可以使用从 lookup
字典创建的 map
列:
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|
#+-----+----+----+
另一种方法是从字典创建一个 lookup_df
然后加入你的数据框
您在 LOOKUP
字典中使用 CASE WHEN
语句和 python f-strings
:
from pyspark.sql import functions as F
column = 'col1' #column to replace
e = f"""CASE {' '.join([f"WHEN {column}='{k}' THEN '{v}'" for k,v in LOOKUP.items()])}
ELSE NULL END"""
out = df.withColumn("col2",F.expr(e))
out.show()
+-----+----+----+
|index|col1|col2|
+-----+----+----+
| 0| 1| 5|
| 1| 3| 4|
| 2| 4| 6|
+-----+----+----+
我有一个小型 PySpark DataFrame df
:
index col1
0 1
1 3
2 4
还有一本字典:
LOOKUP = {0: 2, 1: 5, 2: 5, 3: 4, 4: 6}
我现在想向 df
添加一个额外的列 col2
,等于 col1
的 LOOKUP
值。
我的输出应该是这样的:
index col1 col2
0 1 5
1 3 4
2 4 6
我尝试使用:
df = df.withColumn(col("col2"), LOOKUP[col("col1")])
但这给了我错误,以及使用 expr
.
如何在 PySpark 中实现这一点?
您可以使用从 lookup
字典创建的 map
列:
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|
#+-----+----+----+
另一种方法是从字典创建一个 lookup_df
然后加入你的数据框
您在 LOOKUP
字典中使用 CASE WHEN
语句和 python f-strings
:
from pyspark.sql import functions as F
column = 'col1' #column to replace
e = f"""CASE {' '.join([f"WHEN {column}='{k}' THEN '{v}'" for k,v in LOOKUP.items()])}
ELSE NULL END"""
out = df.withColumn("col2",F.expr(e))
out.show()
+-----+----+----+
|index|col1|col2|
+-----+----+----+
| 0| 1| 5|
| 1| 3| 4|
| 2| 4| 6|
+-----+----+----+