我想使用开始和长度定义为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)
...
`
有关于如何实现这一点的想法吗?
谢谢!
发布于 2019-01-04 03:30:03
您不能使用内置的UDF DSL函数slice
(因为它需要恒定的切片边界),您可以使用DataFrame。如果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-Expression:
df
.select(expr("slice(x,from,until)"))
.show()
https://stackoverflow.com/questions/54027488
复制相似问题