PySpark:基于数据框中具有 UUID 的列添加新列

Posted

技术标签:

【中文标题】PySpark:基于数据框中具有 UUID 的列添加新列【英文标题】:PySpark: Add new column based on a column with UUID in a dataframe 【发布时间】:2019-02-13 09:25:30 【问题描述】:

:)

我正在处理一个我想公开展示的庞大数据集(数据框),我想匿名化数据,所以我不想让用户的UUID像使用带有字符串的新列一样使用:

用户1,用户2,用户3,

明显对应另一栏的ID

当/否则时我无法使用它们,因为我在 df 中有超过一千个不同的 uuids

所以最终结果应该是这样的:

| UUID | User | |uuid1 |user1 | |uuid1 |user1 | |uuid2 |user2 | |uuid3 |user3 |

我尝试编写一个函数,每次uuid 更改时都会增加用户“名称”中的数字,但如果您有任何其他简单的想法,请告诉我! :)

【问题讨论】:

您可以只使用 UUID 创建一个单独的数据框,并使用 monotonically_increasing_id() 添加一个新列,然后重新加入这个新列 请发布您的尝试实现以及初始数据框架构 【参考方案1】:

一个可能的解决方案是这样的:

from pyspark.sql.functions import *
df1 = spark.createDataFrame([("uuid1",),("uuid1",),("uuid2",),("uuid3",)], ["UUID"])
df2 = df1.distinct().withColumn("User",concat(lit("User"),\
row_number().over(Window.orderBy("UUID"))))


df1.join(df2,["UUID"]).show()

它会获取您的数据框并创建一个包含所有用户的独特列表。然后在列表按 UUID 排序后创建另一列,其中包含字符串“用户”和适当的行号。所以你有越来越多的用户名,例如用户1,用户2,用户3,...

输出:

+-----+-----+
| UUID| User|
+-----+-----+
|uuid3|User3|
|uuid1|User1|
|uuid1|User1|
|uuid2|User2|
+-----+-----+

【讨论】:

我以我将如何使用它的方式实现它,并尽快发布它,但是很好的解决方案!谢谢!! 所以我唯一需要改变的是从原始数据集 (df1) 中获取 ID,所以我有我们讨论的方式 (df2) 中的 uuid 列表。然后我制作了另一个数据框以将 uuid 与用户名 (df3) 连接起来,然后将其加入原始数据集:) finalDF = df3.join(df1,["student_institution_id"]) display(finalDF)

以上是关于PySpark:基于数据框中具有 UUID 的列添加新列的主要内容,如果未能解决你的问题,请参考以下文章

计算一次UDF

Pyspark 基于其他列和运行计数器添加列

如何在 Spark 数据框中添加具有序列值的列?

有啥方法可以在 pyspark 数据框中找到包含数据的列数

在另一列pyspark中创建具有字符串长度的列

应用 StringIndexer 更改 PySpark 数据框中的列