Срезать массив структур, используя значения столбцов - PullRequest
0 голосов
/ 03 января 2019

Я хочу использовать функцию Spark Slice с началом и длиной, определенной как Column (s).

def slice(x: Column, start: Int, length: Int): Column

x выглядит так:

`|-- x: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- a: double (nullable = true)
 |    |    |-- b : double (nullable = true)
 |    |    |-- c: double (nullable = true)
 |    |    |-- d: string (nullable = true)
 |    |    |-- e: double (nullable = true)
 |    |    |-- f: double (nullable = true)
 |    |    |-- g: long (nullable = true)
 |    |    |-- h: double (nullable = true)
 |    |    |-- i: double (nullable = true)
...
`

есть идеи, как этого добиться?

Спасибо!

1 Ответ

0 голосов
/ 03 января 2019

Для этого нельзя использовать встроенную функцию DSL DataFrame slice (так как для этого требуются постоянные границы срезов), для этого можно использовать UDF. Если df является вашим фреймом данных и у вас есть столбец from und until, то вы можете сделать:

val mySlice = udf(
  (data:Seq[Row], from:Int, until:Int) => data.slice(from,until),
  df.schema.fields.find(_.name=="x").get.dataType
)

df
  .select(mySlice($"x",$"from",$"until"))
  .show()

В качестве альтернативы, вы можете использовать выражение SQL в Spark SQL:

df
   .select(expr("slice(x,from,until)"))
   .show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...