Сумма столбцов typedLit оценивается как NULL - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь создать столбец суммы, беря сумму значений строк набора столбцов в кадре данных.Поэтому я использовал следующий метод:

val temp_data = spark.createDataFrame(Seq(
  (1, 5),
  (2, 4),
  (3, 7),
  (4, 6)
)).toDF("A", "B")

val cols  = List(col("A"), col("B"))
temp_data.withColumn("sum", cols.reduce(_ + _)).show
+---+---+---+
|  A|  B|sum|
+---+---+---+
|  1|  5|  6|
|  2|  4|  6|
|  3|  7| 10|
|  4|  6| 10|
+---+---+---+

Таким образом, этот метод работает нормально и дает ожидаемый результат.Однако я хочу создать переменную cols без явного указания имен столбцов.Поэтому я использовал typedLit следующим образом.

val cols2 = temp_data.columns.map(x=>typedLit(x)).toList

, когда я смотрю на cols и cols2, они выглядят одинаково.

cols: List[org.apache.spark.sql.Column] = List(A, B)
cols2: List[org.apache.spark.sql.Column] = List(A, B)

Однако, когда я использую cols2чтобы создать мой столбец суммы, он не работает так, как я ожидаю.

temp_data.withColumn("sum", cols2.reduce(_ + _)).show
+---+---+----+
|  A|  B| sum|
+---+---+----+
|  1|  5|null|
|  2|  4|null|
|  3|  7|null|
|  4|  6|null|
+---+---+----+

Кто-нибудь знает, что я здесь делаю неправильно?Почему второй метод не работает так же, как первый?

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Вы пытаетесь использовать typedLit, что неверно, и, как и в другом упомянутом ответе, вам не нужно использовать функцию с TypedColumn. Вы можете просто использовать преобразование карты для столбцов информационного кадра, чтобы преобразовать его в List (Col)

Измените ваше утверждение cols2 на ниже и попробуйте.

val cols  = temp_data.columns.map(f=> col(f))
temp_data.withColumn("sum", cols.reduce(_ + _)).show

Вы получите ниже вывод.

+---+---+---+
|  A|  B|sum|
+---+---+---+
|  1|  5|  6|
|  2|  4|  6|
|  3|  7| 10|
|  4|  6| 10|
+---+---+---+

Спасибо

0 голосов
/ 18 января 2019

lit или typedLit не является заменой Column. Для чего ваш код создает список строковых литералов - "A" и "B"

temp_data.select(cols2: _*).show
+---+---+
|  A|  B|
+---+---+
|  A|  B|
|  A|  B|
|  A|  B|
|  A|  B|
+---+---+

и запрашивает их суммы - следовательно, результат не определен.

Вы можете использовать TypedColumn здесь:

import org.apache.spark.sql.TypedColumn

val typedSum: TypedColumn[Any, Int] = cols.map(_.as[Int]).reduce{ 
  (x, y) => (x + y).as[Int]
}

temp_data.withColumn("sum", typedSum).show

но это не дает никакого практического преимущества перед стандартным Column здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...