【问题标题】:To handle dynamic fields at scala end在 scala 端处理动态字段
【发布时间】:2020-11-19 06:10:20
【问题描述】:

场景是这样的: 我们正在以 JSON 格式从 mongo 中提取数据并通过 spark 进行处理。 有时我们无法在复杂数据类型中获得所需的字段,例如嵌套的字符串数组或数组中的结构。

  1. 在加载 JSON 文件以将空值放入缺失字段时是否有任何解决方法。 (验证者检查)

2.如果想在scala端处理动态性质,它应该是怎样的。

def checkAvailableColumns(df: DataFrame, expectedColumnsInput: List[String]) : DataFrame = {
    expectedColumnsInput.foldLeft(df) {
        (df,column) => {
            if(df.columns.contains(column) == false) {
                df.withColumn(column,lit("null"))
            }
            else (df)
        }
    }
}

我正在使用上面的代码来验证源端是否存在列,同时与所需的列名进行比较,如果不存在,则将该列设置为 null。 这里的问题是如何将复杂的数据类型(如结构数组)转换为通用列名,以便我可以比较它。 (我可以使用点运算符来提取带有结构的列,但如果该列不存在,我的脚本将失败。

【问题讨论】:

  • 请添加更多信息以及您尝试过的示例代码,但它不起作用,以便其他人可以帮助您
  • 我已经更新了试图解决该场景的代码。
  • 如果您以 json 格式存储数据,您的输出数据格式是什么.. spark 将跳过空列.. 尝试使用 orc 或 parquet 来存储数据
  • 是的 srinivas 我正在使用镶木地板来存储数据。

标签: json scala apache-spark-sql


【解决方案1】:

看看Scala Option 类。假设你有一个

case class JsonTemplate(optionalArray: Option[Seq[String]])

假设您获得了有效的 json {},解析器会将 None 作为值。你会得到实例:JsonTemplate(None)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-03
    • 2013-06-01
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多