Spark union 因嵌套 JSON 数据帧而失败

2024-01-02

我有以下两个 JSON 文件:

{
    "name" : "Agent1",
    "age" : "32",
    "details" : [{
            "d1" : 1,
            "d2" : 2
        }
    ]
}

{
    "name" : "Agent2",
    "age" : "42",
    "details" : []
}

我带着火花读了它们:

val jsonDf1 = spark.read.json(pathToJson1)
val jsonDf2 = spark.read.json(pathToJson2)

使用以下模式创建两个数据框:

root
 |-- age: string (nullable = true)
 |-- details: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- d1: long (nullable = true)
 |    |    |-- d2: long (nullable = true)
 |-- name: string (nullable = true)

root
|-- age: string (nullable = true)
|-- details: array (nullable = true)
|    |-- element: string (containsNull = true)
|-- name: string (nullable = true)

当我尝试与这两个数据帧执行联合时,出现此错误:

jsonDf1.union(jsonDf2)


org.apache.spark.sql.AnalysisException: unresolved operator 'Union;;
'Union
:- LogicalRDD [age#0, details#1, name#2]
+- LogicalRDD [age#7, details#8, name#9]

我该如何解决这个问题?有时,我会在 Spark 作业将加载的 JSON 文件中得到空数组,但它仍然必须统一它们,这应该不是问题,因为 Json 文件的架构是相同的。


如果您尝试合并两个数据帧,您将得到以下结果:

error:org.apache.spark.sql.AnalysisException: Union can only be performed on tables with the compatible column types. ArrayType(StringType,true) <> ArrayType(StructType(StructField(d1,StringType,true), StructField(d2,StringType,true)),true) at the second column of the second table

Json文件同时到达

为了解决这个问题,如果你可以同时读取JSON,我建议:

val jsonDf1 = spark.read.json("json1.json", "json2.json")

这将给出这个架构:

jsonDf1.printSchema
 |-- age: string (nullable = true)
 |-- details: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- d1: long (nullable = true)
 |    |    |-- d2: long (nullable = true)
 |-- name: string (nullable = true)

数据输出

jsonDf1.show(10,truncate = false)
+---+-------+------+
|age|details|name  |
+---+-------+------+
|32 |[[1,2]]|Agent1|
|42 |null   |Agent2|
+---+-------+------+

Json 文件到达的时间不同

如果您的 json 在不同时间到达,作为默认解决方案,我建议读取具有完整数组的模板 JSON 对象,这将使您的数据帧具有可能的空数组,对任何联合都有效。然后,在输出结果之前,您将使用过滤器删除这个假 JSON:

val df = spark.read.json("jsonWithMaybeAnEmptyArray.json", 
"TemplateFakeJsonWithAFullArray.json")

df.filter($"name" !== "FakeAgent").show(1)

请注意:开放了Jira卡,以提高合并SQL数据类型的能力:https://issues.apache.org/jira/browse/SPARK-19536 https://issues.apache.org/jira/browse/SPARK-19536并且这种操作应该在下一个Spark版本中可以实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spark union 因嵌套 JSON 数据帧而失败 的相关文章

随机推荐

  • 设置混合模式来绘制笔划?

    我查了一下 认为我的问题的答案是 否 但这里是 使用 Javascript 和 canvas 标签 我可以用以下命令绘制漂亮的 alpha 混合线stroke 这很有趣 但我想通过设置笔画的混合模式来更进一步 例如 看起来它正在使用经典的
  • 如何使用 Spring Sleuth 记录 MDC?

    我有一个基于 Spring boot sleuth 的应用程序 一切都按预期进行 我现在有这样的日志 2017 05 04 17 55 52 226 INFO alert 692d0eeca479e216 c3c8b680dc29ad02
  • 在 asp.net mvc 中以编程方式中止 OutputCache 持续时间

    我使用 OutputCache 属性在服务器端缓存操作的 html 输出 很好 它有效 但现在我遇到的情况是内容很少发生变化 但当发生变化时 用户在下一个请求时看到新数据至关重要 那么 有没有办法以编程方式中止页面缓存持续时间 是的 可以使
  • 为什么上标数字的 Unicode 字符显示高度不一样?

    为什么 Unicode 数字上标的显示高度不一样 如果您用上标数字组成两位数 这一点尤其明显 其中一些看起来不错 但其余的看起来彼此格格不入 我错过了什么吗 或者事实就是如此 Like jrturton https stackoverflo
  • 可编程地通过扬声器发出和播放声音 C++

    我正在用本机 vc 不是 Net 制作游戏 我正在寻找一种通过真正的扬声器 不是内部扬声器 播放噪音 可能是 8 位或其他 的方法 我了解 PlaySound 但我不想让我的 EXE 变大 我想对声音进行编程 是否有一种 api 方式 有点
  • PHPExcel:如何设置单元格的日期格式

    我需要将日期保存到 Excel 文件 它必须以 dd mm yyyy 格式 或用户的本地日期格式 输出 并被视为日期 以便其中的一列可以正确排序 这是代码
  • 如何捕获另一个进程的未处理异常?

    我想修改或仅加载 NET 可执行文件 然后处理其未处理的异常 我的目标是制作一个可以发送堆栈跟踪的智能处理程序 假设另一个可执行文件是 NET 应用程序 将其加载到新的AppDomain http msdn microsoft com en
  • Selenium 2.50 不适用于 Firefox 45

    我在使用 Firefox 和 webdriver 时遇到错误 45000 毫秒后无法通过端口 7055 连接到主机 127 0 0 1 火狐版本 45 0 硒 2 50 1 Windows 10 64 位 有没有人遇到类似的问题或知道解决方
  • 实施的标签系统中的错误

    我按照 Hartl 的教程制作了一个带有标记系统的 ToDoList 也借助了这个单词指南 https medium com sherzelsmith add a filtering multiple tag system with aut
  • C# - SSL 与 Websphere MQ 版本 7.0.1

    使用 C 连接到启用 SSL 的队列管理器时 需要设置哪些值才能使队列正常工作 我目前收到此错误 原因代码 2393 MQRC SSL INITIALIZATION ERROR 在我的代码中 我设置 MQEnvironment SSLKey
  • 结帐页面上的返回购物车按钮

    有什么解决方案可以显示 返回购物车 WooCommerce 结帐页面上的按钮 实际上只有一个完整的订单按钮 但是如果用户想要更正他的订单 我们需要一个后退按钮 Thanks 是的 可以在结帐页面上使用 返回购物车 按钮显示自定义通知 这是自
  • Powershell / VSTS 构建 - 独立存储凭据/与用户运行脚本无关

    我正在尝试为构建创建一个脚本 用于签出文件 编辑文件并将其重新签入 我希望它在作为开发人员或构建代理运行时能够工作 我有一个类似的解决方案this https stackoverflow com a 25455769 852806 密码存储
  • 将大型本地数据库与服务器数据库同步(MySQL)

    我需要每周将大型 3GB 40 表 本地 MySQL 数据库同步到服务器数据库 这两个数据库完全相同 本地数据库不断更新 大约每周服务器数据库都需要使用本地数据更新 您可以将其称为 镜像数据库 或 主 主 但我不确定这是否正确 目前数据库仅
  • 编辑 swf 文件中的动作脚本

    我已经尝试了 10 个小时来编辑这个 swf 文件 它看起来与反编译器中的预期完全一样 但是当我将其导出到闪存时 它是一个空白画布 并且我无法访问操作脚本 我想做的只是在动作脚本中编辑一些东西 我什至不碰电影 有没有更简单的方法来做到这一点
  • Android Studio,logcat 在应用程序关闭后清理

    自从 Android Studio 更新 1 2 Beta 以来 我的 logcat 遇到了问题 当我运行我的应用程序时 它会像平常一样记录所有内容 然后我的应用程序崩溃了 应用程序说 不幸的是 游戏已停止 几秒钟后 Android 会关闭
  • 使用 Jquery 更改页面标题

    如何进行动态变化
  • trac-admin /path/to/myproject initenv

    我的 Trac 有问题 我无法创建新项目 在这里 在 path to myproject 中 我应该写什么来代替它 事实上 我的项目路径是 C Users Programmer BitNami Trac Stack 项目 每次它在 BitN
  • C# 析构函数的使用示例

    我正在阅读有关 C 中的析构函数的内容 但我无法为其找到合适的用例 有人可以提供一个用法示例并进行解释吗 非常非常感谢 Update书中的代码示例实现了 Destructor 和 Dispose 方法 请参阅书中的代码片段 class My
  • Pandas 按索引计数分组和排序

    假设我有这个数据框 d Path abc abc ghi ghi jkl jkl Detail foo bar bar foo foo foo Program prog1 prog1 prog1 prog2 prog3 prog3 Valu
  • Spark union 因嵌套 JSON 数据帧而失败

    我有以下两个 JSON 文件 name Agent1 age 32 details d1 1 d2 2 name Agent2 age 42 details 我带着火花读了它们 val jsonDf1 spark read json pat