Случайная выборка в Писпарке без дубликатов - PullRequest
1 голос
/ 05 июня 2019

У меня есть Pyspark DataFrame, я хочу случайной выборкой (из любой точки всего df) ~ 100 000 уникальных идентификаторов. DF основан на транзакциях, поэтому идентификатор будет появляться несколько раз, я хочу получить 100 000 различных идентификаторов, а затем получить все записи транзакций для каждого из этих идентификаторов из DF.

Я пробовал:

sample = df.sample(False, 0.5, 42)
sample = sample.distinct()

Тогда я не уверен, как сопоставить его с исходным Df. Кроме того, некоторые из идентификаторов не являются чистыми, я хочу иметь возможность поместить в пример условие, которое говорит, что идентификатор должен состоять, например, из 10 цифр.

Ответы [ 2 ]

2 голосов
/ 05 июня 2019
df
.where("length(ID) == 10") # only 10 digit ids
.select("ID").distinct()   # you want it unique on id
.sample(False, 0.5, 42)    # now you take the sample
.join(df, "ID")            # and finally join it

На самом деле не так сложно, так как вы уже указали все необходимые шаги.

1 голос
/ 05 июня 2019

Я предпочитаю работать с хэшами, если хочу убедиться, что получаю один и тот же набор данных снова и снова. Это тоже довольно случайно. С помощью этого метода вы можете выбрать X% ваших уникальных идентификаторов, поэтому, если вы хотите иметь ~ 100 тыс. Идентификаторов, вам нужно выполнить некоторые математические операции.

import pyspark.sql.functions as F
df = df.wihtColumn("hash", F.hash(F.col("ID")) % 1000) # number between -999 and 999
df = df.filter("hash = 0")

Вам также следует проверить распределение, я думаю, вам нужно взять абсолютное значение хеша, потому что оно может быть и отрицательным.

В качестве альтернативы:

df = df.wihtColumn("hash", F.abs(F.hash(F.col("ID")) % 1000)) # number between 0 and 999

С этой логикой вы получите 0,1% ваших идентификаторов более или менее случайно выбранных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...