Spark:如何从 Spark 数据帧行解析和转换 json 字符串

2023-12-08

如何在 pyspark 中解析和转换来自 Spark 数据帧行的 json 字符串?

我正在寻找如何解析的帮助:

  • json 字符串到 json 结构output 1
  • 将 json 字符串转换为 a、b 和 id 列output 2

背景:我通过 API json 字符串获取大量行(jstr1, jstr2, ...),这些被保存到 Sparkdf。我可以单独读取每一行的模式,但这不是解决方案,因为它非常慢,因为模式有大量行。每个jstr具有相同的架构,列/键 a 和 b 保持相同,只是id并且列中的值发生变化。

编辑:使用 MapType 模式的 blackbishop 解决方案就像一个魅力schema = "map<string, array<struct<a:int,b:int>>>"

问题延伸至:如何从 pyspark 中的 Spark 数据帧行转换具有多个键的 JSON 字符串?

from pyspark.sql import Row
jstr1 = '{"id_1": [{"a": 1, "b": 2}, {"a": 3, "b": 4}]}'
jstr2 = '{"id_2": [{"a": 5, "b": 6}, {"a": 7, "b": 8}]}'
    
df = sqlContext.createDataFrame([Row(json=jstr1),Row(json=jstr2)])
    
schema = F.schema_of_json(df.select(F.col("json")).take(1)[0].json)
df2 = df.withColumn('json', F.from_json(F.col('json'), schema))
df2.show()

电流输出:

+--------------------+
|                json|
+--------------------+
|[[[1, 2], [3, 4]]]  |
|                  []|
+--------------------+

所需输出1:

+--------------------+-------+
|         json      |   id   |
+--------------------+-------+
|[[[1, 2], [3, 4]]] |   id_1 |
|[[[5, 6], [7, 8]]] |   id_2 |
+--------------------+-------+ 

所需输出2:

+---------+----------+-------+
|    a    |     b    |   id  |
+--------------------+-------+
|    1    |    2     |  id_1 |
|    3    |    4     |  id_1 |
|    5    |    6     |  id_2 |
|    7    |    8     |  id_2 |
+---------+----------+-------+
 

第二行的值为空,因为您仅使用第一行的架构,该架构与第二行不同。您可以将 JSON 解析为 MapType,其中键为字符串类型,值为结构数组类型:

schema = "map<string, array<struct<a:int,b:int>>>"

df = df.withColumn('json', F.from_json(F.col('json'), schema))

df.printSchema()
#root
# |-- json: map (nullable = true)
# |    |-- key: string
# |    |-- value: array (valueContainsNull = true)
# |    |    |-- element: struct (containsNull = true)
# |    |    |    |-- a: integer (nullable = true)
# |    |    |    |-- b: integer (nullable = true)

然后,通过一些简单的转换,您可以获得预期的输出:

  • The id列代表映射中的键,您可以通过以下方式获得它map_keys功能
  • 结构体<a:int, b:int>代表您使用的值map_values功能
output1 = df.withColumn("id", F.map_keys("json").getItem(0)) \
            .withColumn("json", F.map_values("json").getItem(0))

output1.show(truncate=False)

# +----------------+----+
# |json            |id  |
# +----------------+----+
# |[[1, 2], [3, 4]]|id_1|
# |[[5, 6], [7, 8]]|id_2|
# +----------------+----+

output2 = output1.withColumn("attr", F.explode("json")) \
    .select("id", "attr.*")

output2.show(truncate=False)

# +----+---+---+
# |id  |a  |b  |
# +----+---+---+
# |id_1|1  |2  |
# |id_1|3  |4  |
# |id_2|5  |6  |
# |id_2|7  |8  |
# +----+---+---+
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spark:如何从 Spark 数据帧行解析和转换 json 字符串 的相关文章

随机推荐

  • Pandas:to_csv() 得到了意外的关键字参数

    当我尝试使用数据帧 to csv 函数中的某些参数时 它会抛出 TypeError 例如 TypeError to csv gets an Unexpected keywords argument doublequote df to csv
  • Powershell:在特定的当前同级元素后添加新的 XML 元素

    我有一个 xml 列表 我希望在其中添加一个新的子元素
  • 如何使用 SQLite 将值转入列?

    我做了一张桌子叫tbl用这个代码 CREATE TABLE tbl Year int Album varchar 255 Artist varchar 255 Label varchar 255 Genre varchar 255 id i
  • 从对象数组内的数组返回唯一的数组值

    我找不到类似的问题 我有点卡住了 我有以下 JSON 数组 Name element1 Attributes 1 2 Name element2 Attributes 1 3 Name element3 Attributes 我正在尝试创建
  • 重新构造复数因子向量,千位后用逗号分隔

    我想重新格式化一个因子向量 以便它包含的数字有千位分隔符 该向量包含整数和实数 对于值或顺序没有任何特定规则 Data 特别是 我正在使用向量vec类似于下面生成的 content lt c 0 100 0 100 0 100 0 100
  • PowerShell 包装器将管道输入定向到 Python 脚本

    我正在尝试编写一个小工具 让我可以将命令输出通过管道传输到剪贴板 我已读完multiple answers在 Stack Overflow 上 但它们对我不起作用 因为它们不包含管道 或者因为它们没有使用函数 或者它们只是抛出错误 或者也许
  • 在 bash 脚本中批量 mv 或重命名 - 附加日期作为后缀

    经过大量搜索和反复试验 我无法进行批量处理mv or rename在文件目录上 我想做的是移动或重命名目录中的所有文件 以便mv d or renamed 文件有 date Y d m 添加到原来的后缀 所有原始文件都有唯一的前缀 但要么
  • 如何在 Holoviews 中设置活动工具

    有时我的情节会被绘制pan工具活跃 有时他们用pan and wheel zoom积极的 我愿意强行wheel zoom在渲染时处于活动状态 有没有办法做到这一点 自从 Holoviews 1 11 0 发布以来 原来的答案已经过时了 Ho
  • CIFilter后图像旋转

    我正在将 CIFilter 应用于肖像图像 由于某种原因 它顺时针旋转了 90 度 我怎样才能解决这个问题 我的代码如下 var imgOrientation oImage imageOrientation var imgScale oIm
  • 以编程方式创建属性集和属性

    我正在使用以下链接中列出的代码 http www magentocommerce com wiki 5 modules and development catalog programmatically adding attributes a
  • 在 Google Spreadsheet API 中查找最后写入的行

    有什么方法可以找到您在 Java 的 google 电子表格中编写的最后一行吗 我尝试通过将一个变量保存在另一个文件中来做到这一点 并在每次进行另一次写入时更新该变量 还有其他办法吗 在 Google Spreadsheet API 中查找
  • 如何更改 Haskell 矩阵中的某个值?

    我对 Haskell 很陌生 还没有完全理解它是如何工作的 在下面的方法中 我想更改矩阵中的某个值或在 Haskell 中实现的列表列表 setEntry Int gt Int gt Int gt Int gt Int setEntry x
  • Jetpack Compose - 语音识别

    你知道如何申请吗语音识别 语音识别器 在 Jetpack Compose 中 就像是this 但在 Compose 中 我按照以下步骤操作this video 在清单中添加了这些权限
  • spring jdbctemplate 和 Hibernate 之间的区别[重复]

    这个问题在这里已经有答案了 我的问题很简单 Spring jdbcTemplate 和 Hibernate 之间的主要区别是什么 我们在使用其中之一时应考虑的主要原因是什么 Thanks Hibernate 是一个非常庞大的解决方案 具有数
  • .bat 重命名文件名删除前 x 个字符和最后 x 个字符

    我需要重命名某个文件夹中的文件 就像所解释的那样 它需要通过删除我设置的第一个 x 字符数和最后一个 x 字符数来重命名一个文件夹中的文件名 有人可以告诉我该怎么做吗 干得好 echo off setlocal enabledelayede
  • 如何计算多个数据帧之间的重叠行?

    我有一个如下所示的多个数据框 df1 pd DataFrame Col1 aaa ddd ggg Col2 bbb eee hhh Col3 ccc fff iii df2 pd DataFrame Col1 aaa zzz qqq Col
  • 将自定义函数与 Timber 一起使用

    我一直在尝试使用 Timber 入门主题中的示例并按照木材文档 但我一生都无法让它发挥作用 我的functions php是这样的 class StarterSite extends TimberSite function my funct
  • 如何使用 PHP PDO 解析 MySQL 数据库中的对象数据?

    我在尝试从数据库返回对象数据时遇到了问题 我跟着本教程构建一个数据库包装器 并一直在尝试扩展它的功能以满足我的需求 我的问题是 当我使用 DB 类 get 方法返回数据时 它还返回 PDO 对象本身的实例 我想知道如何解析这些数据 以便只返
  • sdk 管理器中没有软件包或平台

    在 sdk 管理器中 我看不到任何要安装的软件包或任何平台 我尝试以管理员身份运行sdk并禁用防病毒程序和防火墙 而且我已经多次尝试卸载并重新安装它 但没有成功 我的 installer r18 windows exe 版本为 18 ADT
  • Spark:如何从 Spark 数据帧行解析和转换 json 字符串

    如何在 pyspark 中解析和转换来自 Spark 数据帧行的 json 字符串 我正在寻找如何解析的帮助 json 字符串到 json 结构output 1 将 json 字符串转换为 a b 和 id 列output 2 背景 我通过