【问题标题】:spark scala - get a value from json jdbc columnspark scala - 从 json jdbc 列中获取值
【发布时间】:2021-04-25 01:54:51
【问题描述】:

在用于将数据加载到 Spark 中的 mysql jdbc 数据源中,有一列包含字符串中的 JSON。

// JDBC Connection and load table in Dataframe
val verDf = spark.read.format("jdbc").option("driver", driver).option("url", url).option("dbtable", verticesTable).option("user", user).option("password", pass).load()
verDf.printSchema
root
 |-- id: integer (nullable = true)
 |-- url: string (nullable = true)
 |-- al: string (nullable = true) -->> this is JSON string
 |-- batch_id: integer (nullable = true)
 |-- x: double (nullable = true)
 |-- y: double (nullable = true)
 |-- z: double (nullable = true)
 |-- size: double (nullable = true)

JSON 在 al 列中,并且只需要单个值。我怎样才能提取它?我见过 from_json/get_json_schema 方法,它看起来既昂贵又笨重 - 应该创建模式,然后将 JSON 解包到 Map 等中。

val schema = schema_of_json(lit(verDf.select($"al").as[String].first))

所以当我在上面运行这条线时,它会超时或运行几分钟(4-8 分钟)。

  • 我不明白为什么 - 它应该只占用第一行并解析 json 来生成它的模式。为什么这么长(json 值大约有 1-2 KB,很小的对象)?
  • 有没有机会使用一些类似mysql的功能 json_extract() 从 JSON 字符串中提取相对较快的值?

【问题讨论】:

    标签: json scala apache-spark


    【解决方案1】:

    函数 get_json_object 完全按照要求工作 - 它需要 2 个参数 - 列名和路径:

    val newsh=spark.sql("select get_json_object(verDf.al,'$.key1.paramName') from table where table.key=value")
    

    【讨论】:

      猜你喜欢
      • 2022-11-11
      • 1970-01-01
      • 2016-03-13
      • 2017-03-03
      • 2021-12-09
      • 2021-11-06
      • 1970-01-01
      • 2015-06-17
      • 2016-08-25
      相关资源
      最近更新 更多