from pyspark.sql.functions import col, create_map, lit
from itertools import chain
mapping_expr = create_map([lit(x) for x in chain(*mapping.items())])
df.withColumn("value", mapping_expr.getItem(col("key")))
== Physical Plan ==
*Project [key#15, keys: [B,DNS,DS,F,E,H,C,G,A], values: [S,S,S,NS,NS,NS,S,NS,S][key#15] AS value#53]
+- Scan ExistingRDD[key#15]
与UDF版本相比:
== Physical Plan ==
*Project [key#15, pythonUDF0#61 AS value#57]
+- BatchEvalPython [translate_(key#15)], [key#15, pythonUDF0#61]
+- Scan ExistingRDD[key#15]
在Spark〉= 3.0中,getItem应替换为__getitem__([]),即:
from pyspark.sql.functions import col, create_map, lit
from itertools import chain
mapping_expr = create_map([lit(x) for x in chain(*mapping.items())])
df.withColumn("value", mapping_expr[col("key")])
6条答案
按热度按时间rxztt3cl1#
UDF解决方案效率低下(版本无关):
结果是:
更高效的方法(Spark〉= 2.0,Spark〈3.0)是创建一个
MapType
常量:结果是一样的
但更高效的执行计划:
与UDF版本相比:
在Spark〉= 3.0中,
getItem
应替换为__getitem__
([]
),即:taor4pac2#
听起来最简单的解决方案是使用replace函数:http://spark.apache.org/docs/2.4.0/api/python/pyspark.sql.html#pyspark.sql.DataFrame.replace
j5fpnvbx3#
如果你想从嵌套字典创建一个Map列,你可以使用:
kmb7vmvb4#
如果没有
itertools
导入,列表解析可以很好地处理它。来自法令的Map:
提取值:
全检:
h22fl7wq5#
在Spark SQL中可以使用字典转换为大小写语法的函数
jexiocij6#
如果有人也需要Map空值,the accepted answer不适合我,map类型的问题是它不能处理空值键。
但是我们可以用生成的CASE WHEN语句替换它,并使用
isNull
代替== None
: