Разделите Spark DataFrame на два DataFrames (70% и 30%) на основе столбца id, сохранив порядок

У меня есть фрейм данных искры, который похож на

id  start_time   feature
1   01-01-2018   3.567
1   01-02-2018   4.454
1   01-03-2018   6.455
2   01-02-2018   343.4
2   01-08-2018   45.4
3   02-04-2018   43.56
3   02-07-2018   34.56
3   03-07-2018   23.6

Я хочу иметь возможность разделить это на два фрейма данных на основе столбца id. Поэтому я должен сгруппировать по столбцу id, отсортировать по start_time и взять 70% строк в один фрейм данных и 30% строки в другой кадр данных, сохраняя порядок. Результат должен выглядеть так:

Dataframe1:
id  start_time   feature
1   01-01-2018   3.567
1   01-02-2018   4.454
2   01-02-2018   343.4
3   02-04-2018   43.56
3   02-07-2018   34.56

Dataframe2:
1   01-03-2018   6.455
2   01-08-2018   45.4
3   03-07-2018   23.6

Я использую Spark 2.0 с Python. Каков наилучший способ реализовать это?


person Gayatri    schedule 23.10.2018    source источник
comment
Возможный дубликат стратифицированной выборки в Spark и Стратифицированная выборка с помощью pyspark   -  person 10465355    schedule 24.10.2018
comment
Я проверил этот ответ, но он не отвечает, как сохранить порядок при разделении.   -  person Gayatri    schedule 24.10.2018
comment
Из примера, который вы опубликовали, похоже, что вы берете последнюю дату в каждой группе, чтобы быть частью одного из разделенных dfs, это требование? Если нет, я бы сказал, просто отсортируйте по я, затем start_time, а затем выберите случайные разбиения   -  person sramalingam24    schedule 24.10.2018


Ответы (1)


Я должен был сделать это, создав два окна:

w1 =  Window.partitionBy(df.id).orderBy(df.start_time)
w2 =  Window.partitionBy(df.id)

df = df.withColumn("row_number",F.row_number().over(w1))\
                     .withColumn("count",F.count("id").over(w2))\
                     .withColumn("percent",(F.col("row_number")/F.col("count")))
train = df.filter(df.percent<=0.70)
test = df.filter(df.percent>0.70)
person Gayatri    schedule 01.11.2018