случайно инициализированный кадр данных в искре - PullRequest
2 голосов
/ 19 марта 2019

Мне нужно создать фрейм данных с n строками, и каждое значение столбца строки инициализируется случайным образом 0/1. Пример кадра данных:

+----+----+----+
| id | c1 | c2 |
+----+----+----+
|  1 |  0 |  1 |
|  2 |  1 |  1 |
|  3 |  1 |  0 |
+----+----+----+

В настоящее время я использую следующую процедуру:

  • создать пустой фрейм данных
  • генерирует индивидуальную последовательность
  • добавить к существующему фрейму данных с помощью union ()

Код выглядит следующим образом:

for (k <- 0 until n) { 
  var newRow = k+:Seq.fill(N)(Random.nextInt(2)) // random fill with 0/1 and appending id
  X = X.union(newRow.toDF())
}

Влияет ли вышеуказанный метод на производительность (время работы)? Есть ли лучший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 19 марта 2019

Существует неявный метод, который создает DataFrame из Iterable в Scala, вы можете использовать его при условии, что он состоит из кортежей. Следующий код:

val a = (for (_ <- 0 until 5) yield Seq.fill(3)(Random.nextInt(2)))
    .map(x => (x(0), x(1), x(2)))
import spark.implicits._
a.toDF.show

Дает следующий результат:

+---+---+---+
| _1| _2| _3|
+---+---+---+
|  0|  1|  1|
|  1|  0|  0|
|  0|  0|  0|
|  0|  1|  0|
|  1|  1|  1|
+---+---+---+

Вы можете предоставить схему / переименовать столбцы правильно. Более подробную информацию о том, почему эти внутренние структуры должны быть кортежами, можно найти в этом ответе .

0 голосов
/ 19 марта 2019

Влияет ли вышеуказанный метод на производительность (время выполнения)?

В целом ряде случаев, но в первую очередь в результате растущего происхождения и плана выполнения.Кроме того, вызов toDF для локальной последовательности сохранит все данные в памяти драйвера.

Другими словами - он вообще не масштабируется.

Есть ли что-нибудь лучше?способ сделать это?

Конечно, есть:

import org.apache.spark.sql.functions.rand

spark.range(n).select(
  $"id" + 1 as "id", 
  (rand() > 0.5) cast("integer") as "c1", (rand() > 0.5) cast("integer") as "c2")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...