我想使用起始位置和长度定义为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)
...
`
关于如何实现这一目标的任何想法?
谢谢!
答案 0 :(得分:1)
您不能为此使用内置的DataFrame DSL函数slice
(因为它需要恒定的分片范围),因此可以使用UDF。如果df
是您的数据框,并且您有from
和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()
或者,您可以在Spark SQL中使用SQL表达式:
df
.select(expr("slice(x,from,until)"))
.show()