我正在根据列中的值动态地将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
添加到原始名称中。