Pyspark Autonumber над разделительной колонкой - PullRequest
0 голосов
/ 11 февраля 2019

В моем фрейме данных есть столбец, который является чувствительным.Мне нужно заменить чувствительное значение на число, но я должен сделать это так, чтобы различное число столбцов, о которых идет речь, оставалось точным.Я думал о функции 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()
      )

enter image description here

Я хотел бы создатьфрейм данных, как показано ниже.

Как это сделать.

enter image description here

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Это еще один способ сделать это, может быть не очень эффективным, потому что 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... и, наконец, объединение двух информационных фреймов.

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|
+------------+----------------+
0 голосов
/ 11 февраля 2019

Вы ищете 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|
+------------+----------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...