首页 > 解决方案 > 检查 spark 中是否存在嵌套列

问题描述

让我们有以下内容

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

输出

有效路径的输出 无效路径的输出

在这里,如果存在列(路径),我们将获得价值,否则我们会获得异常,但在这种情况下,我想获得像“NOT_FOUND”这样的价值,这可能吗?

预期产出

在此处输入图像描述

标签: scalaapache-sparkapache-spark-sqlpyspark-sql

解决方案


我找到了一个更好的解决方案,我们可以用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

推荐阅读