getItem с аргументом является именем столбца - PullRequest
0 голосов
/ 20 ноября 2018

Мой столбец 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 голосов
/ 20 ноября 2018

Можно использовать выражение 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.
...