List 使用PySpark将列表中的值映射到新值

List 使用PySpark将列表中的值映射到新值,list,dictionary,pyspark,many-to-one,List,Dictionary,Pyspark,Many To One,我正在尝试使用Pyspark重新编码一个值列表,以创建一个新列。我已经用嵌套字典设置了映射,但无法找到映射语法。原始数据有几个字符串值,需要重新编码为新值,然后我想给列一个新名称。原始列值将以几种不同的方式分组,以创建不同的新列 df将有几千列,因此我需要代码尽可能高效 我有一个1-1映射的不同场景,在该场景中,我可以使用以下内容创建表达式: #expr = [ create_map([lit(x) for x in chain(*values.items())])[orig_df[key]].

我正在尝试使用Pyspark重新编码一个值列表,以创建一个新列。我已经用嵌套字典设置了映射,但无法找到映射语法。原始数据有几个字符串值,需要重新编码为新值,然后我想给列一个新名称。原始列值将以几种不同的方式分组,以创建不同的新列

df将有几千列,因此我需要代码尽可能高效

我有一个1-1映射的不同场景,在该场景中,我可以使用以下内容创建表达式:

#expr = [ create_map([lit(x) for x in chain(*values.items())])[orig_df[key]].cast(IntegerType()).alias('new_name') for key, values in my_dict.items() if key in orig_df.columns]
我就是搞不懂将多映射到一的语法

以下是我尝试过的:

grouping_dict = {'orig_col_n':{'new_col_n_a': {'20':['011','012'.'013'],'30':['014','015','016']},
    'new_col_n_b': {'25':['011','013','015'],'35':['012','014','016']}}}

expr = [ f.when(f.col(key) == f.lit(old_val),f.lit(new_value))
    .cast(IntegerType())
    .alias(new_var_name) 
    for key, new_var_names_dict in grouping_dict.items()
    for new_var_name,mapping_dict in new_var_names_dict.items()
    for new_value,old_value_list in mapping_dict.items()
    for  old_val in old_value_list 
    if key in original_df.columns]
                  

new_df = original_df.select(*expr)  
这个表达式不太正确,它在循环遍历需要映射的值时创建了多个同名列

如果您能为我的字典或语法的修改提供任何建议,我们将不胜感激

原始列新列新列新列
0112025
0122035
013 20 25
01430 35
015 30 25

016 30 35

您能否更新您的问题并包括您的输入和输出数据的外观?这有助于更好地理解您是否可以将您的字典构建为一个1,然后您可以轻松地将此字典应用于rdd