Как случайным образом выбрать строки из одного фрейма данных, используя информацию из другого фрейма данных

Следующее я пытаюсь сделать в Scala-Spark.

Я надеюсь, что кто-то может дать мне совет о том, как решить эту проблему, или предоставит мне ресурсы, чтобы выяснить, что я могу сделать.

У меня есть dateCountDF со счетом, соответствующим дате. Я хотел бы случайным образом выбрать определенное количество записей для каждого dateCountDF.month из другого фрейма данных entitiesDF, где dateCountDF.FirstDate<entitiesDF.Date && entitiesDF.Date <= dateCountDF.LastDate, а затем поместить все результаты в новый фрейм данных. См. ниже пример данных

Я совершенно не уверен, как подойти к этой проблеме с точки зрения Spark-SQl или Spark-MapReduce. Самым дальним, что я получил, был наивный подход, когда я использую foreach в фрейме данных, а затем обращаюсь к другому фрейму данных внутри функции. Но это не работает из-за распределенной природы Spark.

val randomEntites = dateCountDF.foreach(x => {
  val count:Int = x(1).toString().toInt 
  val result = entitiesDF.take(count)
  return result
})

DataFrames

**dateCountDF**
|   Date   |      Count     |
+----------+----------------+
|2016-08-31|               4|
|2015-12-31|               1|
|2016-09-30|               5|
|2016-04-30|               5|
|2015-11-30|               3|
|2016-05-31|               7|
|2016-11-30|               2|
|2016-07-31|               5|
|2016-12-31|               9|
|2014-06-30|               4|
+----------+----------------+
only showing top 10 rows

**entitiesDF**
|    ID    |     FirstDate   | LastDate |
+----------+-----------------+----------+
|       296|       2014-09-01|2015-07-31|
|       125|       2015-10-01|2016-12-31|
|       124|       2014-08-01|2015-03-31|
|       447|       2017-02-01|2017-01-01|
|       307|       2015-01-01|2015-04-30|
|       574|       2016-01-01|2017-01-31|
|       613|       2016-04-01|2017-02-01|
|       169|       2009-08-23|2016-11-30|
|       205|       2017-02-01|2017-02-01|
|       433|       2015-03-01|2015-10-31|
+----------+-----------------+----------+
only showing top 10 rows

Изменить: для пояснения. Мои входы entitiesDF и dateCountDF. Я хочу перебрать dateCountDF и для каждой строки выбрать случайное количество сущностей в entitiesDF, где dateCountDF.FirstDate<entitiesDF.Date && entitiesDF.Date <= dateCountDF.LastDate


person J Schmidt    schedule 13.04.2017    source источник
comment
Что такое ввод и какой вывод вы хотите, можете снова объяснить на примере   -  person learner    schedule 13.04.2017
comment
@RahulNirdhar Спасибо, Рахул. Смотрите мою добавленную правку. Сообщите мне, если это проясняет ситуацию?   -  person J Schmidt    schedule 13.04.2017
comment
ты получил ответ на это   -  person learner    schedule 26.04.2017


Ответы (1)


Чтобы выбрать случайный, вы делаете это в scala

import random 
def sampler(df, col, records):

  # Calculate number of rows
  colmax = df.count()

  # Create random sample from range
  vals = random.sample(range(1, colmax), records)

  # Use 'vals' to filter DataFrame using 'isin'
  return df.filter(df[col].isin(vals))

выберите случайное количество строк, которые вы хотите сохранить в фрейме данных, и добавьте эти данные в другой фрейм данных, для этого вы можете использовать unionAll.

также вы можете сослаться на этот ответ

person learner    schedule 13.04.2017