带参数的getItem是列名

时间:2018-11-19 23:21:15

标签: scala apache-spark user-defined-functions

我的列col1是一个数组。

我知道col1.getItem(2)允许您访问列的第二个参数。是否有一个将参数作为列col1.getItem(col2)进行访问的函数?

我可以创建一个UDF,但是我必须指定数组是哪种类型(并且可以是多种类型),所以通用的方法会更好并且值得欢迎!

我使用的UDF:

  def retrieveByIndexSingle[T : ClassTag](value:Seq[T] ,index:Int,offset:Int=0):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)
  })

1 个答案:

答案 0 :(得分:1)

例如,可以将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。