на основном DF и выбранном DF @EmmaNej

я есть искраDataFrame который имеет один столбец, который имеетмного нулей и очень мало (только 0,01% из них).

Я хотел бы взять случайную подвыборку, но стратифицированную - чтобы в этом столбце сохранялось отношение 1 к 0.

Можно ли это сделать в pyspark?

Я ищубез Scala решение и на основеDataFrameа неRDD-исходя из.

Ответы на вопрос(1)

Решение Вопроса

Стратифицированный отбор проб в Искредовольно просто конвертировать изScala впитон (или дажеЯва - Какой самый простой способ стратифицировать набор данных Spark?).

Тем не менее я перепишу этопитон, Давайте начнем с создания игрушкиDataFrame :

from pyspark.sql.functions import lit
list = [(2147481832,23355149,1),(2147481832,973010692,1),(2147481832,2134870842,1),(2147481832,541023347,1),(2147481832,1682206630,1),(2147481832,1138211459,1),(2147481832,852202566,1),(2147481832,201375938,1),(2147481832,486538879,1),(2147481832,919187908,1),(214748183,919187908,1),(214748183,91187908,1)]
df = spark.createDataFrame(list, ["x1","x2","x3"])
df.show()
# +----------+----------+---+
# |        x1|        x2| x3|
# +----------+----------+---+
# |2147481832|  23355149|  1|
# |2147481832| 973010692|  1|
# |2147481832|2134870842|  1|
# |2147481832| 541023347|  1|
# |2147481832|1682206630|  1|
# |2147481832|1138211459|  1|
# |2147481832| 852202566|  1|
# |2147481832| 201375938|  1|
# |2147481832| 486538879|  1|
# |2147481832| 919187908|  1|
# | 214748183| 919187908|  1|
# | 214748183|  91187908|  1|
# +----------+----------+---+

ЭтотDataFrame имеет 12 элементов, как вы можете видеть:

df.count()
# 12

Распространяется следующим образом:

df.groupBy("x1").count().show()
# +----------+-----+
# |        x1|count|
# +----------+-----+
# |2147481832|   10|
# | 214748183|    2|
# +----------+-----+

Теперь давайте попробуем:

Сначала мы установим семя:

seed = 12

Найдите ключи для дроби и пример:

fractions = df.select("x1").distinct().withColumn("fraction", lit(0.8)).rdd.collectAsMap()
print(fractions)                                                            
# {2147481832: 0.8, 214748183: 0.8}
sampled_df = df.stat.sampleBy("x1", fractions, seed)
sampled_df.show()
# +----------+---------+---+
# |        x1|       x2| x3|
# +----------+---------+---+
# |2147481832| 23355149|  1|
# |2147481832|973010692|  1|
# |2147481832|541023347|  1|
# |2147481832|852202566|  1|
# |2147481832|201375938|  1|
# |2147481832|486538879|  1|
# |2147481832|919187908|  1|
# | 214748183|919187908|  1|
# | 214748183| 91187908|  1|
# +----------+---------+---+

Теперь мы можем проверить содержимое нашего образца:

sampled_df.count()
# 9

sampled_df.groupBy("x1").count().show()
# +----------+-----+
# |        x1|count|
# +----------+-----+
# |2147481832|    7|
# | 214748183|    2|
# +----------+-----+
 user324525608 дек. 2017 г., 15:09
Большое вам спасибо, это супер-печально - надеюсь, не только для меня.
 Emma Nej01 авг. 2018 г., 21:13
@eliasah, есть ли способ добавить фракции 0,8 и 0,2? Я хочу использовать 0,8 в качестве тренировочного набора, а другие 0,2 в качестве тестового набора. Я пытался получить 0,8, используя этот подход, но у меня возникают трудности с получением других 0,2 в спарк 1.6, где нет поддержки подзапросов
 eliasah02 авг. 2018 г., 09:47
Вы всегда можете использоватьexcept на основном DF и выбранном DF @EmmaNej
 desertnaut06 дек. 2017 г., 19:34
хорошая работа по переносу ваших старых ответов, но с подсветкой кода это выглядит еще лучше;)
 desertnaut06 дек. 2017 г., 19:45
Я получил твою спину тоже: -o

Ваш ответ на вопрос