Spark: ссылка на столбец динамически на основе значения другого столбца - PullRequest
1 голос
/ 17 марта 2019

У меня есть набор данных со многими полями, и одно из полей «valuefieldname» является столбцом ссылки / указателя, который содержит field_name поля, которое должно быть обработано. Как я могу динамически получить значение этого столбца на основе столбца «valuefieldname»?

Мне нужно что-то похожее на приведенный ниже код (который не работает)

val dataSet2 = dataSet1.withColumn("targetoutput", col(col("valuefieldname")))

1 Ответ

1 голос
/ 18 марта 2019

Нет способа динамически ссылаться на столбец непосредственно в плане Spark.Следовательно, динамический доступ должен осуществляться либо через структуру данных, которая является частью плана, либо через несколько планов.Это приводит к трем стратегиям решения проблемы:

  1. Использование UDF для динамического обращения к полю в Row.Это самый общий и самый простой подход.Это работает лучше всего, когда не слишком много столбцов и / или когда данные редки.

  2. Создайте столбец MapType и создайте ссылку на него.В некоторых случаях это может быть более эффективным, чем (1).

  3. Сделать несколько (легких) проходов через данные и объединить результаты.Лучше всего использовать, когда число столбцов мало, а данные в каждом столбце «тяжелые», например, глубоко структурированные и плотные.

Вот как это сделать (1):

def getColumnAs[A](colName: String, row: Row): Option[A] = 
  if (row == null) None
  else {
    val idx = row.fieldIndex(colName)
    if (row.isNullAt(idx)) None else Some(row.getAs[A](idx))
  }

case class Data(col_name: String, x: Option[Int], y: Option[Int])

val df = spark.createDataset(Seq(
  Data("x", Some(1), None), 
  Data("x", Some(2), Some(20)), 
  Data("y", None,    Some(30))
)).toDF

val colValue = udf(getColumnAs[Int] _)

df.select(
    'col_name, 
    colValue('col_name, struct('*)).as("col_value")
  )
  .show

Выход

+--------+---------+
|col_name|col_value|
+--------+---------+
|       x|        1|
|       x|        2|
|       y|       30|
+--------+---------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...