PySpark映射到列,重命名关键列



我正在根据列中的值动态地将Map列转换为多个列。我使用下面的代码(大部分来自这里),它工作得非常好。

但是,我想重命名以编程方式生成的列名。

输入df:

| map_col                                                                        |
|:-------------------------------------------------------------------------------|
| {"customer_id":"c5","email":"abc@yahoo.com","mobile_number":"1234567890"}      |
| null                                                                           |
| {"customer_id":"c3","mobile_number":"2345678901","email":"xyz@gmail.com"}      |
| {"email":"pqr@hotmail.com","customer_id":"c8","mobile_number":"3456789012"}    |
| {"email":"mnk@GMAIL.COM"}                                                      |

将Map转换为列的代码

keys_df = df.select(F.explode(F.map_keys(F.col("map_col")))).distinct()`
keys = list(map(lambda row: row[0], keys_df.collect()))
key_cols = list(map(lambda f: F.col("map_col").getItem(f).alias(str(f)), keys))
final_cols = [F.col("*")] + key_cols
df = df.select(final_cols)

输出df:

| customer_id | mobile_number | email           |
|:----------- |:--------------| :---------------|
| c5          | 1234567890    | abc@yahoo.com   |
| null        | null          | null            |
| c3          | 2345678901    | xyz@gmail.com   |
| c8          | 3456789012    | pqr@hotmail.com |
| null        | null          | mnk@GMAIL.COM   |

我已经有字段customer_id, mobile_number和电子邮件在主数据框中,其中map_col是其中一列。我得到错误,当我试图生成输出,因为相同的列名已经在数据集中。因此,在数据集中生成之前,我需要将这些列名重命名为customer_id_2、mobile_number_2和email_2。. Map_col列可能有比显示的更多的键和值。

所需输出:

| customer_id_2 | mobile_number_2  | email_2         |
|:------------- |:-----------------| :---------------|
| c5            | 1234567890       | abc@yahoo.com   |
| null          | null             | null            |
| c3            | 2345678901       | xyz@gmail.com   |
| c8            | 3456789012       | pqr@hotmail.com |
| null          | null             | mnk@GMAIL.COM   |

在将map转换为列的代码之前添加以下行:

df = df.withColumn('map_col', F.expr("transform_keys(map_col, (k, v) -> concat(k, '_2'))"))

使用transform_keys来更改键名,根据需要将_2添加到原始名称中。

相关内容

  • 没有找到相关文章

最新更新