首页 > 解决方案 > 更换 Spark 的 CASE WHEN THEN

问题描述

我是 Spark 的新手,正在尝试优化另一位开发人员编写的代码。场景如下:

  1. 有一个包含三个键值对的字典列表。第一个是源:值,第二个是目标:值,第三个是列:值。
  2. CASE WHEN THEN 语句是根据以上三个键值对生成的。例如,字典列表如下:
values = [{'target': 'Unknown', 'source': '', 'column': 'gender'}, 
{'target': 'F', 'source': '0', 'column': 'gender'}, 
{'target': 'M', 'source': '1', 'column': 'gender'}, 
{'target': 'F', 'source': 'F', 'column': 'gender'}, 
{'target': 'F', 'source': 'Fe', 'column': 'gender'}]
  1. 以下代码生成随后的 CASE WHEN THEN 语句。
for value in values:
    source_value = value.get("source")
    op = op.when(df[column] == source, value.get("target"))
Column<'CASE WHEN (gender = ) THEN Unknown 
WHEN (gender = 0) THEN F 
WHEN (gender = 1) THEN M 
WHEN (gender = F) THEN F 
WHEN (gender = Fe) THEN F END'>
  1. 然后使用此 CASE WHEN THEN 来从数据帧中选择数据。

问题:CASE WHEN THEN 的用法在这里是否有效(是否已优化)?一些 CASE WHEN 语句非常冗长(大约 1000+)。有没有更好的方法来重做代码(也许是正则表达式)?

我查看了以下问题,但与我的情况无关。 CASE WHEN ... THEN SPARK SQL - 当时的情况

谢谢。

标签: pythonapache-sparkpyspark

解决方案


两种选择:

  • 使用UDF,您可以在其中访问值字典
  • 建表,执行广播连接

知道哪个更好的方法是检查执行计划、作业持续时间和总洗牌。


推荐阅读