如何从json字符串中提取值?

2023-12-13

我有一个文件,其中有一堆列和一个名为jsonstring是字符串类型,其中包含 json 字符串...假设格式如下:

{
    "key1": "value1",
    "key2": {
        "level2key1": "level2value1",
        "level2key2": "level2value2"
    }
}

我想解析此列,如下所示: jsonstring.key1,jsonstring.key2.level2key1 返回 value1, level2value1

我怎样才能在 scala 或 Spark sql 中做到这一点。


在 Spark 2.2 中,您可以使用该函数来自_json它会为你解析 JSON。

from_json(e: 列,模式:字符串,选项:Map[String, String]):列将包含 JSON 字符串的列解析为StructType or ArrayType of StructTypes具有指定的架构。

支持通过使用展平嵌套列*(星)这似乎是最好的解决方案。

// the input dataset (just a single JSON blob)
val jsonstrings = Seq("""{
    "key1": "value1",
    "key2": {
        "level2key1": "level2value1",
        "level2key2": "level2value2"
    }
}""").toDF("jsonstring")

// define the schema of JSON messages
import org.apache.spark.sql.types._
val key2schema = new StructType()
  .add($"level2key1".string)
  .add($"level2key2".string)
val schema = new StructType()
  .add($"key1".string)
  .add("key2", key2schema)
scala> schema.printTreeString
root
 |-- key1: string (nullable = true)
 |-- key2: struct (nullable = true)
 |    |-- level2key1: string (nullable = true)
 |    |-- level2key2: string (nullable = true)

val messages = jsonstrings
  .select(from_json($"jsonstring", schema) as "json")
  .select("json.*") // <-- flattening nested fields
scala> messages.show(truncate = false)
+------+---------------------------+
|key1  |key2                       |
+------+---------------------------+
|value1|[level2value1,level2value2]|
+------+---------------------------+

scala> messages.select("key1", "key2.*").show(truncate = false)
+------+------------+------------+
|key1  |level2key1  |level2key2  |
+------+------------+------------+
|value1|level2value1|level2value2|
+------+------------+------------+
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从json字符串中提取值? 的相关文章

  • 在 Databricks / Spark 中的 SQL 中为变量分配动态值

    我觉得我一定在这里遗漏了一些明显的东西 但我似乎无法在 Spark SQL 中动态设置变量值 假设我有两张桌子 tableSrc and tableBuilder 我正在创建tableDest 我一直在尝试变体 SET myVar FLOA
  • 使用列的长度过滤 DataFrame

    我想过滤一个DataFrame使用与列长度相关的条件 这个问题可能很简单 但我在SO中没有找到任何相关问题 更具体地说 我有一个DataFrame只有一个Column哪一个ArrayType StringType 我想过滤DataFrame
  • SBT 对 Scala 类型感到困惑

    SBT 抛出以下错误 value split is not a member of String String error filter arg gt arg split delimiter length gt 2 对于以下代码块 impl
  • PySpark DataFrame 上分组数据的 Pandas 式转换

    如果我们有一个由一列类别和一列值组成的 Pandas 数据框 我们可以通过执行以下操作来删除每个类别中的平均值 df DemeanedValues df groupby Category Values transform lambda g
  • 按元素聚合数组

    Spark scala 相当新 我想知道是否有一种简单的方法以按列方式聚合 Array Double 这是一个例子 c1 c2 c3 1 1 1 0 1 0 3 4 1 2 1 0 0 0 4 3 2 1 0 0 0 0 0 0 2 3 1
  • 如何防止 SQL Server 在导入数据时去除前导零

    A data file被导入到SQL Server桌子 数据文件中的一列是文本数据类型 该列中的值只能是整数 SQL Server 数据库中目标表中的相应列的类型为varchar 100 但在数据导入后 SQL Server 会存储以下值
  • 对 Spark 数据集中的数字字符串进行排序

    假设我有以下内容Dataset productCode amount XX 13 300 XX 1 250 XX 2 410 XX 9 50 XX 10 35 XX 100 870 Where productCode is of Strin
  • 相当于 scala 中的 python repr()

    有没有相当于Python的东西reprscala 中的函数 即 您可以给任何 scala 对象提供一个函数 它将生成该对象的字符串表示形式 该对象是有效的 scala 代码 eg val l List Map 1 gt a print re
  • Scala:“递归值...需要类型”,但我只使用 Java 类型

    object Rec extends App val outStream new java io ByteArrayOutputStream val out new java io PrintStream new java io Buffe
  • Akka中有轻量级的actor吗?

    我的用例非常简单 在两个对象之间交换少量 现在我正在从 Scala Actors 迁移到 Akka 但是我再也找不到那些轻量级 Actors 使用Akka 我不仅需要为Actor创建创建ActorSystem Props 还需要照顾Acto
  • 使用 org.apache.hadoop/* 依赖项离线编译 sbt 时遇到的问题

    使用依赖于 org apache hadoop 包的 sbt 进行离线编译时遇到很多麻烦 一个简单的build sbt name Test version 1 0 scalaVersion 2 10 4 libraryDependencie
  • Spark 数据帧分组、排序和选择一组列的顶部行

    我正在使用 Spark 1 5 0 我有一个包含以下列的 Spark 数据框 user id description fName weight 我想做的是为每个用户选择前 10 行和后 10 行 基于列权重的值 数据类型为 Double 如
  • SBT插件——编译前执行自定义任务

    我刚刚编写了我的第一个 SBT 自动插件 它有一个生成设置文件的自定义任务 如果该文件尚不存在 当显式调用任务时 一切都会按预期工作 但我希望在使用插件编译项目之前自动调用它 无需项目修改其 build sbt 文件 有没有办法实现这一点
  • Scala 中的高级类型 [重复]

    这个问题在这里已经有答案了 我正在阅读 Scala 中的函数式编程一书 在 Monoids 章节中 他们讨论了 Monoid 接口 如下所示 trait Monoid A def op a1 A a2 A A def zero A 后来 他
  • 为什么我在 Mac 上看到“java.lang.reflect.InaccessibleObjectException: Unable to make private java.nio.DirectByteBuffer(long,int)accessibl

    我已经在工作中愉快地构建代码好几天了 但突然我的一个项目 不是全部 失败并出现此错误消息 看看下面的答案吧 我是如何修复它的 起初我用谷歌搜索 看到很多有这个问题的人正在使用 Java 16 但我认为 错误 我正在使用 Java 11 因为
  • Spark scala:大量列上的简单 UDF 会导致性能下降

    我有一个包含 1 亿行和约 10 000 列的数据框 这些列有两种类型 标准 C i 和动态 X i 这个dataframe是经过一些处理后得到的 性能很快 现在只剩下2步了 Goal 需要使用 C i 列的相同子集对每个 X i 执行特定
  • 如何在scala中生成n-gram?

    我正在尝试在 scala 中编写基于 n gram 的分离新闻算法 如何为大文件生成 n gram 例如 对于包含 蜜蜂是蜜蜂中的蜜蜂 的文件 首先它必须选择一个随机的 n 元语法 例如 蜜蜂 然后它必须寻找以 n 1 个单词开头的 n 元
  • Spark Dataframe/Parquet 中的枚举等效项

    我有一个包含数亿行的表 我想将其存储在 Spark 的数据帧中并作为 parquet 文件持久保存到磁盘 我的 Parquet 文件的大小现在超过 2TB 我想确保我已经对此进行了优化 这些列中很大一部分是字符串值 它们可能很长 但值通常也
  • 如何通过数据框中数组列的索引计算平均值

    我正在使用 Spark 2 2 我有一个关于合作的基本问题ArrayType 我没有找到可以使用的内置聚合函数 Given a DataFrame有一个柱子id和一列values of ArrayType 我们想按 id 分组 然后按索引计
  • Pyspark - 一次聚合数据帧的所有列[重复]

    这个问题在这里已经有答案了 我想将数据框分组到单个列上 然后对所有列应用聚合函数 例如 我有一个包含 10 列的 df 我希望对第一列 1 进行分组 然后对所有剩余列 均为数字 应用聚合函数 sum 与此等效的 R 是 summarise

随机推荐