【问题标题】:Pyspark Autonumber over a partitioning column分区列上的 Pyspark 自动编号
【发布时间】:2019-07-05 03:31:52
【问题描述】:

我的数据框中有一列是敏感的。我需要用一个数字替换敏感值,但必须这样做才能使相关列的不同计数保持准确。我在考虑窗口分区上的 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()
      )

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

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

【问题讨论】:

  • 只用dense_rank

标签: pyspark autonumber


【解决方案1】:

你正在寻找dense_rank函数:

df.withColumn(
  "non_sensitive_id",
  F.dense_rank().over(Window.partitionBy().orderBy("sensitive_id"))
).show()

+------------+----------------+
|sensitive_id|non_sensitive_id|
+------------+----------------+
|        1234|               1|
|        1234|               1|
|        1234|               1|
|        2345|               2|
|        2345|               2|
|        6789|               3|
|        6789|               3|
|        6789|               3|
|        6789|               3|
+------------+----------------+

【讨论】:

    【解决方案2】:

    这是另一种方法,可能效率不高,因为join() 将涉及洗牌 -

    创建 DataFrame -

    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...,最后连接两个数据帧。

    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|
    +------------+----------------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      • 2017-09-13
      • 1970-01-01
      • 2023-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多