带参数的 getItem 是列名

Posted

技术标签:

【中文标题】带参数的 getItem 是列名【英文标题】:getItem with argument is column name 【发布时间】:2018-11-19 23:21:14 【问题描述】:

我的专栏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】:

可以使用 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 开始的。

【讨论】:

以上是关于带参数的 getItem 是列名的主要内容,如果未能解决你的问题,请参考以下文章

SQL一个带参数的存储过程写法

Java带参数的方法?

sql操作带参数的时候用下面的方法,但是如果某个参数为 空值的话会报错,应该怎么改?

带参数的sql语句!不懂

th:href怎么带参数

JavaScript--关于实例对象带不带参数和构造函数带不带参数的关系