我的专栏col1是一个数组。
我知道这col1.getItem(2)允许您访问列的第二个参数。是否有一个函数可以使用参数作为列进行访问col1.getItem(col2) ?
我可以创建一个UDF,但是我必须指定数组的类型(并且它可以是多种类型),所以通用方式会更好并且受欢迎!
我使用的UDF:
def retrieveByIndexSingleT : ClassTag:T = value(index + offset)
def retrieveByIndexSingleDUDF = udf((value:Seq[Double] ,index:Int) => {
retrieveByIndexSingle[Double](value, index)
})
def retrieveByIndexSingleSUDF = udf((value:Seq[String] ,index:Int) => {
retrieveByIndexSingle[String](value, index)
})
可以使用SQL表达式expr:
import org.apache.spark.sql.functions.expr
val df = Seq(
(Seq("a", "b", "c"), 0), (Seq("d", "e", "f"), 2)
).toDF("col1", "col2")
df.withColumn("col3", expr("col1[col2]")).show | ||
---|---|---|
col1 | col2 | col3 |
[a, b, c] | 0 | a |
[d, e, f] | 2 | f |
或者,在Spark 2.4或更高版本中,element_at功能:
import org.apache.spark.sql.functions.element_at
df.withColumn("col3", element_at($"col1", $"col2" + 1)).show | ||
---|---|---|
col1 | col2 | col3 |
[a, b, c] | 0 | a |
[d, e, f] | 2 | f |
请注意,目前(Spark 2.4)这两种方法之间存在不一致:
SQL []索引从0开始。
element_at 索引是基于1的。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。