将列名称复制为 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)
您得到一个具有非常适合表示字典的地图数据类型的列。
我有 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)
您得到一个具有非常适合表示字典的地图数据类型的列。