scala - 带参数的 getItem 是列名
问题描述
我的专栏col1
是一个数组。
我知道这col1.getItem(2)
允许您访问列的第二个参数。是否有一个函数可以使用参数作为 column 访问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)
})
解决方案
可以使用 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 开始的。
推荐阅读
- python - 我做错了什么,当我更改日期时间列的格式时,它会在中途自动更改为不同的格式?
- pandas - 创建具有所需值的对称熊猫 GroupBy
- django - 如何解决 Django 服务器问题
- python - 文件不在指定的任何路径中
- google-bigquery - 使用 bq 命令创建 hive 分区外部表时缺少 hive 分区键列
- reactjs - 反应 js 与数据库
- google-translate - 如何使用 Google 音译 API 使用 Key
- python - 使用pandas模块创建excel文件时如何保持整列中两个变量之间的公共空间
- python - askdirectory() 关闭 Tkinter 窗口
- php - 严格比较失败 laravel Blade,我犯了一些愚蠢的错误