将 JSON 字符串列拆分为多列

2023-11-23

我正在寻找一个通用的解决方案来从 JSON 字符串列中提取所有 json 字段作为列。

df =  spark.read.load(path)
df.show()

“路径”中文件的文件格式是 parquet

样本数据

|id | json_data
| 1 | {"name":"abc", "depts":["dep01", "dep02"]}
| 2 | {"name":"xyz", "depts":["dep03"],"sal":100}
| 3 | {"name":"pqr", "depts":["dep02"], "address":{"city":"SF","state":"CA"}}

预期产出

|id | name    | depts              | sal | address_city | address_state
| 1 | "abc"   | ["dep01", "dep02"] | null| null         | null
| 2 | "xyz"   | ["dep03"]          | 100 | null         | null
| 3 | "pqr"   | ["dep02"]          | null| "SF"         | "CA"

我知道我可以通过创建定义了架构的 StructType 并使用“from_json”方法来提取列。

但这种方法需要手动模式定义。

val myStruct = StructType(
  Seq(
    StructField("name", StringType),
    StructField("depts", ArrayType(StringType)),
    StructField("sal", IntegerType)
  ))

var newDf = df.withColumn("depts", from_json(col("depts"), myStruct))

有没有更好的方法来展平 JSON 列而无需手动定义架构? 在提供的示例中,我可以看到可用的 JSON 字段。 但实际上,我无法遍历所有行来查找所有字段。

因此,我正在寻找一种解决方案,将所有字段拆分为列,而不指定列的名称或类型。


如果它是一个CSV文件,只有一列作为JSON数据。您可以使用以下解决方案。

val csvDF = spark.read.option("delimiter", "|").option("inferSchema", true).option("header", true).csv("test.csv")
val rdd = csvDF.select(" json_data").rdd.map(_.getString(0))
val ds = rdd.toDS
val jsonDF = spark.read.json(ds)
val jsonDFWithID = jsonDF.withColumn("id", monotonically_increasing_id())
val csvDFWithID = csvDF.select($"id ").withColumn("id", monotonically_increasing_id())
val joinDF = jsonDFWithID.join(csvDFWithID, "id").drop("id")

这就是最终数据框的样子。

scala> joinDF.printSchema()
root
 |-- address: struct (nullable = true)
 |    |-- city: string (nullable = true)
 |    |-- state: string (nullable = true)
 |-- depts: array (nullable = true)
 |    |-- element: string (containsNull = true)
 |-- name: string (nullable = true)
 |-- sal: long (nullable = true)
 |-- id : double (nullable = true)

如果它是一个,以下解决方案将起作用JSON文件。 为我。inferSchema工作得很好。

json文件

~/Downloads ▶ cat test.json
{"id": 1, "name":"abc", "depts":["dep01", "dep02"]},
{"id": 2, "name":"xyz", "depts" :["dep03"],"sal":100}

code

scala> scc.read.format("json").option("inerSchema", true).load("Downloads/test.json").show()
+--------------+---+----+----+
|         depts| id|name| sal|
+--------------+---+----+----+
|[dep01, dep02]|  1| abc|null|
|       [dep03]|  2| xyz| 100|
+--------------+---+----+----+
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 JSON 字符串列拆分为多列 的相关文章

随机推荐

  • Android 音频:改变音调

    SoundPool 的 Android 文档称 该应用程序还可以通过实时调整多普勒或合成效果的播放速率来改变音调 所以我尝试这样做 使用 setRate 方法从一个音符平滑地变化到另一个音符 但结果很糟糕 声音变化非常参差不齐 这是我尝试过
  • MySQL 使用 CONCAT 条件进行选择

    我正在尝试在脑海中编译它 我有一个包含名字和姓氏字段的表 我有一个像 Bob Jones 或 Bob Michael Jones 这样的字符串以及其他几个字符串 问题是 例如我有 鲍勃的名字 以及 迈克尔 琼斯的姓氏 所以我想 SELECT
  • Java流是否有相当于带有变量赋值的while

    是否存在与以下内容等效的流 List
  • Tensorflow 从元图中打印所有占位符变量名称

    我有一个张量流模型 其中有 meta 和检查点文件 我试图打印模型所需的所有占位符 而不查看构建模型的代码 以便我可以在不知道模型是如何创建的情况下构建输入 feed dict 作为参考 这里是模型构建代码 在另一个文件中 def save
  • 优秀的 setjmp/longjmp 教程 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 你好 我想阅读有关 C 语言 setjmp longjmp 的优秀教程 如果有真实的而不是人造的示例 那就更好了 Thanks 这并不是一个真正的教程 而是libpng 文档描述该库
  • 应用程序更新后共享首选项丢失

    我一整天都在研究这个问题 以下是要点 共享首选项should当用户更新应用程序时保持持久性 就我而言 更新应用程序后 它们丢失了 这个问题每次都会重现 我从 Play 商店安装旧的 APK 然后adb install r new apk使用
  • 色彩校正 MP4/Webm 视频

    我有一个大型视频 其中一些动画对于其他嵌入方法 gif png 序列等 来说太复杂 太长 并且我们遇到了视频中颜色的问题 本质上 我们将网页背景作为视频的一部分 以防止视频播放时出现任何边缘 我们正在尝试使视频上的渐变背景与网页上的渐变背景
  • Jenkins 的 Github 插件获取提交者和作者姓名

    如果我理解得很好 git 插件会将提交者和作者的姓名以及电子邮件暴露给环境变量GIT AUTHOR NAME GIT COMMITTER NAME GIT AUTHOR EMAIL and GIT COMMITTER EMAIL基于git的
  • Netbeans 等待连接到 XDEBUG

    Netbeans 不会连接到 xdebug 我尝试过以下帖子中的建议 调试 IDE 与 XDebug 的端口连接 等待连接 netbeans 显示 正在等待连接 netbeans xdebug 但这并不能解决我的问题 Netbeans 似乎
  • 带分隔符的 Android 列表视图

    我想创建一个带有分隔符的列表视图 就像在默认联系人应用程序中一样 我的应用程序需要对列表进行排序 并用分隔符分隔项目 如联系人应用程序中的字母顺序排序 能够使用分隔符标题进行滚动将是一个额外的优势 任何指示都会有帮助 谢谢 看看这个开源项目
  • 为什么 numpy.dtype('float64') 很特别?

    有人可以解释以下脚本输出背后的逻辑吗 import numpy if numpy dtype numpy float64 None print Surprise 谢谢 看起来像是一场不幸的事故 有人决定dtype None 将 默认 浮动
  • 如何创建可重用的表单 Vue 组件

    假设我想创建一个联系表单 在此联系表单中 用户可以有多个地址 我认为这是使用 Vue 组件的绝佳机会 这样我就不必创建冗余的地址表单字段 然后我就可以在网站的不同区域使用这个组件 比如编辑 创建等 我将如何创建一个父级可以使用的表单组件 并
  • 将参数传递给 Dart Polymer 元素

    我能找到的 Dart Polymer 的唯一可靠示例不使用任何参数 如何将参数传递给模板 是通过构造函数完成的吗 我的具体示例是 我有一个带有标题的卡片元素 我想将卡片的标题作为字符串传递给该元素 我看过将数据传递给 Polymer 元素
  • 使用 CLASP 测试 GAS 时如何模拟依赖关系

    背景 我最近了解到CLASP并对使用的可能性感到兴奋TDD编辑我的谷歌应用脚 本 天然气 本地 NOTE 可能有一种方法可以使用现有的 GAS 编辑器编写测试 但如果可能的话 我更愿意使用现代编辑器 clasp 效果很好 但我无法弄清楚如何
  • 谷歌图表时间线水平滚动

    我有一个时间线图表 与本页的第一个示例非常相似 https developers google com chart interactive docs gallery timeline 我在 Y 轴上有活动 做午餐 吃饭 等等 在 X 轴上我
  • 使用 Django ORM 处理大量大记录

    我有一个包含大约 30k 记录的表 我正在尝试使用 Django 的 ORM 对其进行迭代和处理 每条记录存储几个二进制 blob 每个二进制 blob 的大小可以是几 MB 我需要对其进行处理并将其写入文件 然而 由于内存限制 我在使用
  • 在C中显示颜色数组[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我的程序既写入又读取颜色数组 如下所示 struct Image size t width size t height struct Color data struct Color c
  • 将非 ASCII 字符输入到 scanf("%s")

    有没有一种方法可以向使用的 scanf 发出非 ascii 十六进制字符 s 我正在尝试插入十六进制字符 例如 x08 xDE xAD等等 以演示缓冲区溢出 输入不是命令行参数 而是程序内的 scanf 我假设您想在标准输入上提供任意数据
  • 从共享库获取枚举定义

    我正在使用 ctypes 访问用 C 编写的共享库 共享库的 C 源代码包含一个枚举 例如 enum invalid 0 type1 1 type2 2 type enum 在Python方面 我打算只为各种枚举值定义整数常量 例如 INV
  • 将 JSON 字符串列拆分为多列

    我正在寻找一个通用的解决方案来从 JSON 字符串列中提取所有 json 字段作为列 df spark read load path df show 路径 中文件的文件格式是 parquet 样本数据 id json data 1 name