Spark Scala - Извлечь элементы массива в новую строку - PullRequest
0 голосов
/ 25 марта 2020

У меня есть следующий фрагмент кода, где я вижу результат, но не понимаю, как именно он сделан:

val Df = Seq(Seq(4,7,9)).toDf("x")
val Ds = Df.withColumn("t", $"x").as[(Seq[Int], Seq[Int])]
ds.flatMap{
case(x1,x2) => x2.map((x1,_))
}.toDf("v1","v2")

Результат выглядит так:

+---------+---+
|v1       |v2 |
+---------+---+
|[4, 7, 9]|4  |
|[4, 7, 9]|7  |
|[4, 7, 9]|9  |
+---------+---+

Мои вопросы: 1) Почему это так:

Df.withColumn("t", $"x").as[(Seq[Int], Seq[Int])]

вводит одинаковое содержимое в оба столбца, даже если у этого спецификатора c Seq нет имени для ссылки? Почему он не создает пустые последовательности?

2) результатом плоской карты должен быть список / массив, почему он становится набором данных с 2 столбцами?

3) что означает case (x1,x2) в этой конкретной ситуации? Почему в скобках?

4) x2.map((x1,_)) какие именно операции выполняет здесь функция карты? Я вижу, что требуется x2 (второй столбец), я понимаю, что «_» означает элемент Seq, но я полностью скучаю по всей связной картине.

1 Ответ

0 голосов
/ 25 марта 2020

1) t имеет то же содержимое, что и x, поэтому имейте информационный кадр с двумя столбцами (x, t), оба типа массива с одинаковым содержимым

2) map в API DataFrame сопоставляет строки, а не элементы одной строки. x2.map((x1,_)) становится Seq кортежей, первый из которых x1 (т. Е. Ваш x столбец), второй - один элемент вашего t массива столбцов

3) это шаблон сопоставление (unapply) для tuple2 (т. е. Seq[Int], Seq[Int])), x1 и x2 являются Seqs / массивами

4), это то же самое, что select($"x",explode($"t")) в DataFrame API. Для каждого элемента в t создается новая строка (таким образом, вы получаете 3 строки)

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