使用列值对结构切片数组

时间:2019-01-03 18:01:36

标签: apache-spark

我想使用起始位置和长度定义为Column(s)的Spark slice功能。

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 :(得分:1)

您不能为此使用内置的DataFrame DSL函数slice(因为它需要恒定的分片范围),因此可以使用UDF。如果df是您的数据框,并且您有fromuntil列,则可以执行以下操作:

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()

或者,您可以在Spark SQL中使用SQL表达式:

df
   .select(expr("slice(x,from,until)"))
   .show()