У меня есть следующий фрагмент кода, где я вижу результат, но не понимаю, как именно он сделан:
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, но я полностью скучаю по всей связной картине.