проверка наличия вложенного столбца в искре - PullRequest
0 голосов
/ 13 февраля 2020

позволяет нам иметь следующее

case class SubRecord(x: Int)
case class ArrayElement(foo: String, bar: Int, vals: Array[Double])
case class Record(
  an_array: Array[Int], a_map: Map[String, String], 
  a_struct: SubRecord, an_array_of_structs: Array[ArrayElement])

val df = sc.parallelize(Seq(
  Record(Array(1, 2, 3), Map("foo" -> "bar"), SubRecord(1),
         Array(
           ArrayElement("foo", 1, Array(1.0, 2.0, 2.0)),
           ArrayElement("bar", 2, Array(3.0, 4.0, 5.0)))),
  Record(Array(4, 5, 6), Map("foz" -> "baz"), SubRecord(2),
         Array(ArrayElement("foz", 3, Array(5.0, 6.0)), 
               ArrayElement("baz", 4, Array(7.0, 8.0))))
)).toDF

Output

Output for valid path Output for invalid path

Здесь мы получим значение, если столбец (путь) существует, в противном случае мы получим исключение, но я хочу получить значение, например, NOT_FOUND, в этом случае, возможно ли это?

Ожидаемый результат

enter image description here

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

Я нашел лучшее решение, мы можем просто safeCol () вместо col () метод

 def DataFrameSafeCol(df:DataFrame)(path: String): Column = {
      Try(df(path)) match {
        case Success(x) => x
        case Failure(_) => lit("NOT_FOUND")
      }
  }

Тогда мы можем использовать, как показано ниже

val safeCol=DataFrameSafeCol(df)(_) // function currying
df.select(safeCol("column_name")).show
0 голосов
/ 13 февраля 2020

Как я это сделал, как показано ниже

Пожалуйста, поделитесь Если у кого-нибудь есть лучшее решение ??

Я реализовал следующие методы

import scala.util.{Failure, Success, Try}

def getValue(df: DataFrame, path: String)= {
    when(lit(Try(df(path)).isSuccess),
      Try(df(path)) match {
        case Success(_) => df(path)
        case Failure(_) => lit("")
      })
      .otherwise("NOT_FOUND").as(path)
  }
  • getValue () -> проверяет путь в кадре данных и выдает требуемые значения

ВЫХОД

enter image description here

...