将列名称复制为 Pyspark 数据框中列的所有值中的字典键

Copying column name as dictionary key in all values of column in Pyspark dataframe

我有 pyspark df,分布在集群中如下:

Name  ID
A     1
B     2
C     3

我想修改 'ID' 列,使所有值成为 python 字典,其中列名作为键,值作为列中的现有值,如下所示:

Name  TRACEID
A     {ID:1}
B     {ID:2}
C     {ID:3}

如何使用 pyspark 代码实现此目的?我需要一个有效的解决方案,因为它是一个跨集群的大容量分布式 df。 提前致谢。

您可以先从ID列构造一个struct,然后使用to_json函数将其转换为需要的格式。

df = df.select('Name', F.to_json(F.struct(F.col('ID'))).alias('TRACEID'))

您可以使用create_map函数

from pyspark.sql.functions import col, lit, create_map
sparkDF.withColumn("ID_dict", create_map(lit("id"),col("ID"))).show()
# +----+---+---------+
# |Name| ID|  ID_dict|
# +----+---+---------+
# |   A|  1|{id -> 1}|
# |   B|  2|{id -> 2}|
# |   C|  3|{id -> 3}|
# +----+---+---------+

Rename/drop 列:

df = sparkDF.withColumn("ID_dict",create_map("id",col("ID"))).drop(col("ID")).withColumnRenamed("ID_dict", "ID")
df.show()
# +----+---------+
# |Name|       ID|
# +----+---------+
# |   A|{id -> 1}|
# |   B|{id -> 2}|
# |   C|{id -> 3}|
# +----+---------+

df.printSchema()
# root
#  |-- Name: string (nullable = true)
#  |-- ID: map (nullable = false)
#  |    |-- key: string
#  |    |-- value: long (valueContainsNull = true)

您得到一个具有非常适合表示字典的地图数据类型的列。