首页 > 解决方案 > 分区列上的 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()
      )

在此处输入图像描述

我想创建一个如下所示的数据框。

有什么方法可以完成这项工作。

在此处输入图像描述

标签: pysparkautonumber

解决方案


这是这样做的另一种方式,可能不是很有效,因为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|
+------------+----------------+

推荐阅读