pyspark - 分区列上的 Pyspark 自动编号
问题描述
我的数据框中有一列是敏感的。我需要用一个数字替换敏感值,但必须这样做才能使相关列的不同计数保持准确。我在考虑窗口分区上的 sql 函数。但是找不到办法。
下面是一个示例数据框。
df = (sc.parallelize([
{"sensitive_id":"1234"},
{"sensitive_id":"1234"},
{"sensitive_id":"1234"},
{"sensitive_id":"2345"},
{"sensitive_id":"2345"},
{"sensitive_id":"6789"},
{"sensitive_id":"6789"},
{"sensitive_id":"6789"},
{"sensitive_id":"6789"}
]).toDF()
.cache()
)
我想创建一个如下所示的数据框。
有什么方法可以完成这项工作。
解决方案
这是这样做的另一种方式,可能不是很有效,因为join()
会涉及洗牌 -
创建数据框 -
from pyspark.sql.window import Window
from pyspark.sql.functions import col, row_number
df = sqlContext.createDataFrame([(1234,),(1234,),(1234,),(2345,),(2345,),(6789,),(6789,),(6789,),(6789,)],['sensitive_id'])
创建不同元素的 DataFrame 并标记它们1,2,3...
,最后连接两个 DataFrame。
df_distinct = df.select('sensitive_id').distinct().withColumn('non_sensitive_id', row_number().over(Window.orderBy('sensitive_id')))
df = df.join(df_distinct, ['sensitive_id'],how='left').orderBy('sensitive_id')
df.show()
+------------+----------------+
|sensitive_id|non_sensitive_id|
+------------+----------------+
| 1234| 1|
| 1234| 1|
| 1234| 1|
| 2345| 2|
| 2345| 2|
| 6789| 3|
| 6789| 3|
| 6789| 3|
| 6789| 3|
+------------+----------------+
推荐阅读
- android - 在 Android 9 上禁用强制门户检查
- zabbix - Windows 上的 Zabbix 远程命令
- c# - AutoMapper:使用构造函数注入映射到目标类型(Prism、Unity、EntityFramework)
- python - 是否有一个函数(或更好的方法)使用 Pandas 中具有相似值的两列来聚合计数值的数量?
- streaming - 在 Apache Druid 中重新索引多个数据
- go - 匿名函数的参数错误 - 不是类型
- html - 如何创建鼠标悬停信息弹出窗口(如 facebook 用户图片上的鼠标悬停)
- python - 将类 pandas.Series 更改为列表
- r - 如何在 ggplot 中创建气泡网格图?
- python-3.x - 删除标签 (, 和
从数据框,然后导出到 csv 并通过电子邮件发送