【问题标题】:Check whether nested data exist on parquet scala spark or not?检查镶木地板scala spark上是否存在嵌套数据?
【发布时间】:2019-12-17 05:29:45
【问题描述】:

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

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

我尝试选择DataFrame中的数据,然后将其转换为.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   |
--------------------

我将whenisNaNisNull 结合使用,如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")
    )
}

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

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

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

当没有找到数据时,我还尝试读取 $"sheep.data.price" 返回的内容。我尝试这样打印:

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

但是,它返回class org.apache.spark.sql.ColumnName

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

【问题讨论】:

    标签: scala dataframe apache-spark parquet


    【解决方案1】:

    使用 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|
    +---+----+-----+
    

    【讨论】:

    • 它仍然对我不起作用。它仍然打印为空,就像我使用 $
    • 我没有使用您的数据框定义,而是直接从 json 数据中获取。而且,我使用了isNull 而不是isNAN。用sheepDF试试我的代码
    • 哇,是的,它显然有效。在解决您的解决方案时有一个错字。现在可以了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 2023-03-10
    • 2016-07-04
    • 1970-01-01
    • 2017-03-17
    • 2018-11-22
    • 1970-01-01
    相关资源
    最近更新 更多