Spark - 从嵌套数组中的结构中选择列时出错

2024-01-11

===========更新========

我在 JSON 中添加了更多详细信息(struct c 和 array_t),以便更清楚地了解异常的位置。

===========================

再会,

我有一个带有结构类型嵌套数组的 Spark DataFrame。我想从该结构中选择一列,但收到错误消息:“org.apache.spark.sql.AnalysisException:无法解析'home.array_a.array_b['a']' 由于数据类型不匹配:参数 2 需要整型,但是 ''a'' 是字符串类型".

这是我的数据:

{
  "home": {
    "a_number": 5,
    "a_string": "six",
    "array_a": [
      {
        "array_b": [{"a": "1", "b": 2}],
        "struct_c": {"a": 1.1, "b": 1.3},
        "array_d": ["a", "b", "c"]
      },
      {
        "array_b": [{"a": "3", "b": 4}],
        "struct_c": {"a": 1.5, "b": 1.6},
        "array_d": ["x", "y", "z"]
      }
    ]
  }
}

这是我的数据架构:

mydf1 = spark.read.option("multiline", "true").json("myJson.json")
mydf1.printSchema()

root
 |-- home: struct (nullable = true)
 |    |-- a_number: long (nullable = true)
 |    |-- a_string: string (nullable = true)
 |    |-- array_a: array (nullable = true)
 |    |    |-- element: struct (containsNull = true)
 |    |    |    |-- array_b: array (nullable = true)
 |    |    |    |    |-- element: struct (containsNull = true)
 |    |    |    |    |    |-- a: string (nullable = true)
 |    |    |    |    |    |-- b: long (nullable = true)
 |    |    |    |-- array_d: array (nullable = true)
 |    |    |    |    |-- element: string (containsNull = true)
 |    |    |    |-- struct_c: struct (nullable = true)
 |    |    |    |    |-- a: double (nullable = true)
 |    |    |    |    |-- b: double (nullable = true)

当我从 array_a 内的 struct_c 或 array_d (字符串数组)选择数据时,没有问题。

mydf1.select("home.array_a.array_d").show(10, False)

+----------------------+
|array_d               |
+----------------------+
|[[a, b, c], [x, y, z]]|
+----------------------+

mydf1.select(col("home.array_a.struct_c.a").alias("struct_field_inside_arrayA")).show(10, False)

+--------------------------+
|struct_field_inside_arrayA|
+--------------------------+
|[1.1, 1.5]                |
+--------------------------+

这是它失败的地方:

mydf1.select("home.array_a.array_b.a").printSchema()
mydf1.select("home.array_a.array_b.a").show()

我期望的是一个字符串的二维数组([["1", "3"]] 是我的示例 JSON)

您能帮忙解释一下为什么失败吗?

感谢您的帮助。

执行第4行失败: mydf1.select("home.array_a.array_b.a").printSchema() 回溯(大多数 最近通话最后):文件 “/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/utils.py”,第 63 行, 装饰风格 返回 f(*a, **kw) 文件“/usr/lib/spark/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py”,行 328,在 get_return_value 中 format(target_id, ".", name), value) py4j.protocol.Py4JJavaError: 调用 o15300.select 时发生错误。 : org.apache.spark.sql.AnalysisException:无法解析 'home.array_a.array_b['a']' 由于数据类型不匹配:参数 2 需要整型,但是 ''a'' 是字符串类型。;; '项目 [home#18213.array_a.array_b[a] AS a#18217] +- 关系[home#18213] json

在 org.apache.spark.sql.catalyst.analysis.package$AnalysisErrorAt.failAnalysis(package.scala:42) 在 org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1$$anonfun$apply$3.applyOrElse(CheckAnalysis.scala:115) 在 org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1$$anonfun$apply$3.applyOrElse(CheckAnalysis.scala:107) 在 org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:27​​8) 在 org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:27​​8) 在 org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(TreeNode.scala:70) 在 org.apache.spark.sql.catalyst.trees.TreeNode.transformUp(TreeNode.scala:27​​7) 在 org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$3.apply(TreeNode.scala:27​​5) 在 org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$3.apply(TreeNode.scala:27​​5) 在 org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$4.apply(TreeNode.scala:326) 在 org.apache.spark.sql.catalyst.trees.TreeNode.mapProductIterator(TreeNode.scala:187) 在 org.apache.spark.sql.catalyst.trees.TreeNode.mapChildren(TreeNode.scala:324) 在 org.apache.spark.sql.catalyst.trees.TreeNode.transformUp(TreeNode.scala:27​​5) 在 org.apache.spark.sql.catalyst.plans.QueryPlan$$anonfun$transformExpressionsUp$1.apply(QueryPlan.scala:93) 在 org.apache.spark.sql.catalyst.plans.QueryPlan$$anonfun$transformExpressionsUp$1.apply(QueryPlan.scala:93) 在 org.apache.spark.sql.catalyst.plans.QueryPlan$$anonfun$1.apply(QueryPlan.scala:105) 在 org.apache.spark.sql.catalyst.plans.QueryPlan$$anonfun$1.apply(QueryPlan.scala:105) 在 org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(TreeNode.scala:70) 在 org.apache.spark.sql.catalyst.plans.QueryPlan.transformExpression$1(QueryPlan.scala:104) 在 org.apache.spark.sql.catalyst.plans.QueryPlan.org$apache$spark$sql$catalyst$plans$QueryPlan$$recursiveTransform$1(QueryPlan.scala:116) 在 org.apache.spark.sql.catalyst.plans.QueryPlan$$anonfun$org$apache$spark$sql$catalyst$plans$QueryPlan$$recursiveTransform$1$2.apply(QueryPlan.scala:121) 在 scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234) 在 scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234) 在 scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59) 在 scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48) 在 scala.collection.TraversableLike$class.map(TraversableLike.scala:234) 在 scala.collection.AbstractTraversable.map(Traversable.scala:104) 在 org.apache.spark.sql.catalyst.plans.QueryPlan.org$apache$spark$sql$catalyst$plans$QueryPlan$$recursiveTransform$1(QueryPlan.scala:121) 在 org.apache.spark.sql.catalyst.plans.QueryPlan$$anonfun$2.apply(QueryPlan.scala:126) 在 org.apache.spark.sql.catalyst.trees.TreeNode.mapProductIterator(TreeNode.scala:187) 在 org.apache.spark.sql.catalyst.plans.QueryPlan.mapExpressions(QueryPlan.scala:126) 在 org.apache.spark.sql.catalyst.plans.QueryPlan.transformExpressionsUp(QueryPlan.scala:93) 在 org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1.apply(CheckAnalysis.scala:107) 在 org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1.apply(CheckAnalysis.scala:85) 在 org.apache.spark.sql.catalyst.trees.TreeNode.foreachUp(TreeNode.scala:127) 在 org.apache.spark.sql.catalyst.analysis.CheckAnalysis$class.checkAnalysis(CheckAnalysis.scala:85) 在 org.apache.spark.sql.catalyst.analysis.Analyzer.checkAnalysis(Analyzer.scala:95) 在 org.apache.spark.sql.catalyst.analysis.Analyzer$$anonfun$executeAndCheck$1.apply(Analyzer.scala:108) 在 org.apache.spark.sql.catalyst.analysis.Analyzer$$anonfun$executeAndCheck$1.apply(Analyzer.scala:105) 在 org.apache.spark.sql.catalyst.plans.logic.AnalysisHelper$.markInAnalyzer(AnalysisHelper.scala:201) 在 org.apache.spark.sql.catalyst.analysis.Analyzer.executeAndCheck(Analyzer.scala:105) 在 org.apache.spark.sql.execution.QueryExecution.analyzed$lzycompute(QueryExecution.scala:57) 在 org.apache.spark.sql.execution.QueryExecution.analyzed(QueryExecution.scala:55) 在 org.apache.spark.sql.execution.QueryExecution.assertAnalyzed(QueryExecution.scala:47) 在 org.apache.spark.sql.Dataset$.ofRows(Dataset.scala:79) 处 org.apache.spark.sql.Dataset.org$apache$spark$sql$数据集$$withPlan(Dataset.scala:3407) 在 org.apache.spark.sql.Dataset.select(Dataset.scala:1335) 处 sun.reflect.GenerateMethodAccessor348.invoke(来源未知)位于 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 处 py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244) 在 py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357) 在 py4j.Gateway.invoke(Gateway.java:282) 在 py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132) 在 py4j.commands.CallCommand.execute(CallCommand.java:79) 处 py4j.GatewayConnection.run(GatewayConnection.java:238) 在 java.lang.Thread.run(Thread.java:748)

在处理上述异常的过程中,又出现了一个异常:

回溯(最近一次调用最后一次):文件 “/tmp/zeppelin_pyspark-5197917387349583174.py”,第 380 行,在 exec(code, _zcUserQueryNameSpace) 文件“”,第 4 行,在文件中 “/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/dataframe.py”,行 1320,在选择 jdf = self._jdf.select(self._jcols(*cols)) 文件“/usr/lib/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py”, 第 1257 行,在call答案,self.gateway_client,self.target_id,self.name)文件“/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/utils.py”,第69行, 装饰风格 引发 AnalysisException(s.split(': ', 1)[1], stackTrace) pyspark.sql.utils.AnalysisException:“无法解析 'home.array_a.array_b['a']' 由于数据类型不匹配:参数 2 需要整型,但是 ''a'' 是字符串 类型.;;\n'项目 [home#18213.array_a.array_b[a] AS a#18217]\n+- 关系[home#18213] json\n"


Since array_a and array_b是数组类型,不能直接选择其元素

您需要按如下方式分解它们,或者您可以通过索引获取

mydf1.withColumn("array_a", explode($"home.array_a"))
  .withColumn("array_b", explode($"array_a.array_b"))
  .select("array_b.a").show(false)

这会给你

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

Spark - 从嵌套数组中的结构中选择列时出错 的相关文章

  • Oracle存储过程使用数组作为表插入的参数

    我一直在寻找一个明显的例子 但没有运气 抱歉 如果已经回答了 我正在尝试做一些非常简单的事情 一个存储过程 它将获取输入并将它们插入到表中 我希望它获取多行数组并一次全部插入 我认为这很简单 但我还没有找到一个可以展示我的例子 在很多例子中
  • 将 2D 矢量转换为 2D 数组

    自从我上次访问数组以来已经有一段时间了 我最近一直在使用向量 我需要将 2D 向量转换回 2D 数组 因为我正在使用的库接受类型的参数double array该数组的访问器在哪里foo i j 例如 这是我的代码 double setupH
  • 根据javascript中对象数组中的id替换特定对象

    我有一系列像这样的对象 var books id 1 name Name of the wind year 2015 rating 4 5 author 2 现在我有一个函数 editBooks 它要求用户提供 id 并用用户给出的值替换具
  • PostgreSQL 中字符串列类型的索引数组

    是否可以在类型为的列上创建索引文本数组 尝试使用GIN索引 但查询似乎没有使用这些索引 Example CREATE TABLE users name VARCHAR 100 groups TEXT Query SELECT name FR
  • NumPy 中按列增长矩阵

    在纯Python中 你可以很容易地逐列增长矩阵 data for i in something newColumn getColumnDataAsList i data append newColumn NumPy http en wiki
  • 释放c循环中的子字符串

    我正在尝试为结构体的每个成员获取一个子字符串 structs 然后将该子字符串分配给temp struct 我遇到的问题是如何在每次迭代时释放子字符串 但是由于某种原因代码运行valgrind抛出一个Invalid read of size
  • C# 可以扩展数组吗?

    我习惯向 IEnumerable 等外部类添加方法 但是我们可以在 C 中扩展数组吗 我计划向数组添加一个方法 将其转换为 IEnumerable 即使它是多维的 不相关如何在 C 中扩展数组 https stackoverflow com
  • 对多列应用窗口函数

    我想执行窗口函数 具体为移动平均值 但针对数据帧的所有列 我可以这样做 from pyspark sql import SparkSession functions as func df df select func avg df col
  • JavaScript 比较数组

    我有一个以下格式的数组 var markers Title 15 102253 38 0505243 Description 1 Another Title 15 102253 38 0505243 Another Description
  • 获取嵌套数组 JS 中对象的所有父对象

    我在使用 vuejs 的项目上遇到问题 我有一个像这样的嵌套对象数组 Data data id 1 parent id null title First folder children id 3 parent id 1 title Firs
  • 寻找嵌套列表中的最低值?

    我正在尝试编写一个函数 它接受一个列表并可以打印该列表中的最小整数 现在我试图弄清楚在嵌套列表中该怎么做 如果最低数字位于这些嵌套列表之一中 那么总的来说它将打印该数字 我的代码在这里 def listMin list2 3 4 2 99
  • 在 Lucene.NET 中索引 Json 对象数组

    我正在努力将任意 json 对象放入 Lucene NET 索引中 给定的对象可能如下所示 name Tony age 40 address street Weakroad number 10 floor 2 door Left skill
  • 匹配数组中的对象并合并

    UPDATE 我有一个名为的对象数组cars包含 li 标签 其中包含有关汽车的属性数据 例如价格 汽车类型等 我的目标是 如果这些汽车符合某些标准 则将它们合并到一个列表中 要求 快速性能 保持相同的汽车数组结构 Main Goal Ma
  • 任务和分区之间有什么关系?

    我能说 么 Spark任务的数量等于Spark分区的数量吗 执行器运行一次 执行器内部的批处理 等于一个任务吗 每个任务只产生一个分区 1 的重复 并行度或可以同时运行的任务数量由以下公式设置 Executor实例的数量 配置 每个执行器的
  • 在 Spark 2.1.0 中启用 _metadata 文件

    Spark 2 1 0 中保存空 Parquet 文件似乎已损坏 因为无法再次读入它们 由于模式推断错误 我发现从 Spark 2 0 开始 写入 parquet 文件时默认禁用写入 metadata 文件 但我找不到重新启用此功能的配置设
  • 关于 ArrayList[] x 的 Java 问题

    我一直对 ArrayList 数组有这个问题 也许你能帮忙 declare in class private ArrayList
  • .push() 将多个对象放入 JavaScript 数组中返回“未定义”

    当我将项目添加到beats数组然后console log用户时 我得到了数组中正确的项目数 但是当我检查 length 时 我总是得到 1 尝试调用索引总是会给我 未定义 如下所示 Tom beats 1 我想我错过了一些明显的东西 但这让
  • 3D 数组到 3D std::vector

    我在代码函数中用 3D std vector 替换了 3D 数组 它进入了无限循环 你能给我一个提示吗 我真的需要使用向量而不是数组 谢谢 我最初的代码是 arr is a 3D array of a sudoku table the 3
  • 如何获得n个具有不同元素数量的数组的所有可能组合?

    我有一些在编程时未知的数组数量 也许是 3 或 4 或 7 每个数组都有一些元素 即 a 1 2 3 4 b 6 7 5 2 1 c 22 4 6 8 4 8 5 4 d e f g 我想通过从每个数组中采样一个数字来获得所有可能的组合 例
  • Fortran 子例程返回错误值

    嘿 我正在开发一个 Fortran 程序 遇到了一个奇怪的问题 当我尝试在调用特定子例程之前直接输出数组的某些值时 我得到了正确的值 然后 我尝试在启动子例程时输出同一数组的一些值 它们都是 0 我最终在子例程之后输出数组的值 并且这些值回

随机推荐

  • JavaScript:document.getElementById() 返回 NULL

    我对 Javascript 还很陌生 但 document getElementById 遇到了一个问题 它总是返回 NULL 这让我抓狂 我的代码中有一个元素 我想获取它的坐标 以便可以移动它 这是代码
  • UIDevice currentDevice 模型可能值

    返回的所有可能值是多少 UIDevice currentDevice model 它不是有记录的 http developer apple com library ios documentation uikit reference UIDe
  • Telerik MVC Extensions Grid - 如何将网格过滤器应用于初始 LINQ 查询或传递到数据库?

    目前 在我的 MVC 网格中 我使用普通的服务器绑定 然后将过滤器作为查询字符串附加到 URL 此方法的问题是 如果我查询默认情况下有数千条记录的网格 但我只在网格的第一页 分页过滤器 上显示前 30 条记录 同样的事情也适用于姓氏的字符串
  • Servlet 中的参数化构造函数

    我可以在 servlet 中声明参数化构造函数吗 如果没有那么为什么 No Servlet 实例由容器通过反射创建 它们期望找到一个公共的 无参数的构造函数 默认构造函数 要配置 servlet 请使用 web xml 文件中指定的 ser
  • 具有多个数据库的 SSAS 立方体

    我有 3 个具有相同结构但数据不同的数据库 因为它们来自不同的客户端 现在 我有一个现有的 SSAS 项目 其数据源视图 多维数据集和维度只能使用或访问一个数据库 我想要的是能够使用具有相同结构的多个数据库 并使用它们创建一个多维数据集 每
  • 奇怪的指向成员函数的指针语法

    我了解如何声明函数的类型 typedef void typedef void f typedef void f is void using alias void f void alias void f is void 它可以用来声明函数指针
  • 在 JPA Criteria API 的子查询中使用 ORDER BY 的替代方法有哪些?

    考虑以下两个表 Project id project name Status id id project status name Where Status包含所有状态 其中Project已经是 假设我们要查询最新状态名称为 new 的所有项
  • 了解 Django CSRF_COOKIE_SAMESITE 和 CSRF_TRUSTED_ORIGINS

    显然 我无法理解跨域环境中 Django 2 2 4 设置对 CSRF 参数的影响 正如我已经注意到的那样 我必须设置SESSION COOKIE SAMESITE None如果我想将我的 Django 应用程序放入具有另一个域的网站的 i
  • symfony2自定义表单日期时间渲染

    我有一个表单 其中的日期时间呈现为 5 个选择输入 d MM YYYY H i builder gt add date datetime array data gt new DateTime now default value format
  • 使用jquery进行POST,如何正确提供'data'参数?

    我想以 POST 方式进行 ajax 调用 它将转到我的 servlet 我想发送参数化数据 如下所示 var mydata param0 some text param1 some more text 我将其作为 jquery ajax
  • Node.js在typeorm实体中添加created_at和updated_at

    I have task像这样的实体 import BaseEntity Column Entity PrimaryGeneratedColumn from typeorm Entity export class Task extends B
  • 如何自定义 Jenkins 构建名称?

    当我在 Jenkins 中运行作业时 每个构建都会被赋予一个名称 该名称显示在构建历史记录的 UI 中 基本上是当前日期和时间 我希望能够在那里输入构建参数 以便我可以在构建历史记录中看到哪些分支已构建以及何时构建 我已经搜索过可以执行此操
  • 将 Vue 与 Django 结合使用

    我最近开始使用 Django 开发一些社交媒体网站 我使用默认的django模板引擎来填充我的页面 但此刻我想补充一点javascript使网站更具活力 这意味着 页眉和页脚是每页都一样 标题应该有一个下拉菜单 一个在您键入时进行搜索的搜索
  • 带有包装内容项的 RecyclerView

    我需要实现下一个 UI 元素 未知大小的字符串列表 来自服务器调用 任何项目都应该是包装内容 如果某个项目不适合该行 则该项目将位于下一行 所有列表 网格均居中 我想用RecyclerView with StaggeredGridLayou
  • vite 构建始终使用静态路径

    我有一个简单的设置 包含一个 index html 一些 js 文件和一个 sass 文件 并使用 vite 构建它 我使用的是 vite 默认值 没有配置文件 运行构建后 dist 文件夹中的 index html 将所有内容引用为静态路
  • 将 XPath 与 Perl 结合使用

    我正在尝试复制我的C XPath代码在 Linux 上使用 Perl 执行 我将示例 8 6 中的代码复制并粘贴到Perl 和 XML http oreilly com catalog 9780596002053 如果我理解正确 我应该能够
  • Cloud Firestore:不同查询上的同一文档。是按分开阅读收费吗?

    我已阅读有关如何操作的文档write read在 Firebase 中是收费的 假设我有 20 项待办事项列表project id作为钥匙 todosRef onSnapshot 将被计为20 reads 我用新属性更新了待办事项 todo
  • 使用 apache-poi 4.0.1 库将单元格内容的某些部分设置为粗体/斜体

    我想用粗体和斜体的组合来设置单元格值的内容 就像 这是Sample content 但是 这不适用于 XSSFrichTextString 我正在使用 apache poi 库版本 4 0 1 我尝试使用 XSSFRichTextStrin
  • 为什么在 Common Lisp 中,当我运行参数为 1 的函数“acos”时,答案是错误的?

    当我运行 acos 1 来查找 1 emacs 的反余弦时 我得到了答案 而不是正确答案 0 6 125742f 17 为什么会这样以及如何得到 0 的正确答案 就像 Windows 计算器所说的那样 我在 Windows 8 上使用 SB
  • Spark - 从嵌套数组中的结构中选择列时出错

    更新 我在 JSON 中添加了更多详细信息 struct c 和 array t 以便更清楚地了解异常的位置 再会 我有一个带有结构类型嵌套数组的 Spark DataFrame 我想从该结构中选择一列 但收到错误消息 org apache