检查 parquet scala spark 上是否存在嵌套数据?

Check whether nested data exist on parquet scala spark or not?

所以,我有一个镶木地板文件,其中包含这样的嵌套数据。我想使用 spark 在 scala 中处理:

[
  {
    "sheep": {
      "id": 1,
      "data": {
        "age": 1,
        "price": 101
      }
    }
  },
  {
    "sheep": {
      "id": 2,
      "data": {
        "age":2
      }
    }
  },
  {
    "sheep": {
      "id": 3,
    }
  }
]

我试过selectDataFrame中的数据,然后转换成.csv文件

def get: DataFrame = {
  sheepDF
    .select(
      $"sheep.id".as("id"),
      $"sheep.data.age".as("age"),
      $"sheep.data.price".as("price")
    )
}

然后,它会生成一个这样的文件:

--------------------
| id | age | price |
--------------------
| 1  |  1  |  123  |
| 2  |  2  |       |
| 3  |     |       |
--------------------

我想要这样的输出文件:

--------------------
| id | age | price |
--------------------
| 1  |  1  |  123  |
| 2  |  2  |   0   |
| 3  |     |   0   |
--------------------

我使用 isNaNisNull 结合 when 就像 this 文章解释。

def get: DataFrame = {
  val priceCol = $"sheep.data.price"

  sheepDF
    .select(
      $"sheep.id".as("id"),
      $"sheep.data.age".as("age"),
      when(priceCol.isNaN, 0).otherwise(priceCol).as("price")
    )
}

我也看到了这个解决方案 ,但我找不到如何使用它。首先,由于我将 $"sheep.data.price"$ 一起使用,我该如何传递给 hasColumn 函数?我如何引用 hasColumn 函数的 df 参数?我应该通过 sheepDF 吗?

然后,当我尝试将 whenhasColumn 结合使用时 我收到此错误:

type mismatch;
 found   : Boolean
 required: org.apache.spark.sql.Column

我也试着在找不到数据的时候读一下这个$"sheep.data.price"returns。我尝试这样打印它:

(lit($"sheep.data.price".getClass.toString())).as("coupon"),

但是,它 returns class org.apache.spark.sql.ColumnName

我知道应该有一个没有 Try 的更简单的解决方案。谢谢!

使用col("column").

df.select(
    col("sheep.id").as("id"),
    col("sheep.data.age").as("age"), 
    when(col("sheep.data.price").isNull, 0).otherwise(col("sheep.data.price")).as("price")).show

结果是:

+---+----+-----+
| id| age|price|
+---+----+-----+
|  1|   1|  101|
|  2|   2|    0|
|  3|null|    0|
+---+----+-----+