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 - 从嵌套数组中的结构中选择列时出错 的相关文章

  • 为什么 length 是 `Array` 的属性而不是 `Array.prototype` 链

    所以我在 V8 控制台上玩了很多 我做到了 Object getOwnPropertyNames 我期望得到 结果 然而 length 所以这意味着不是成为原型链的一部分 length是所有人的成员财产Array对象 这是一个错误 还是有任
  • 使用 Python 计算 Spark 中成对 (K,V) RDD 中每个 KEY 的平均值

    我想与 Python 共享这个特定的 Apache Spark 解决方案 因为它的文档非常贫乏 我想通过 KEY 计算 K V 对 存储在 Pairwise RDD 中 的平均值 示例数据如下所示 gt gt gt rdd1 take 10
  • C 中函数参数中的固定数组或指针之间的区别?

    之间有区别吗 void draw line float p0 2 float p1 2 float color 4 和这个 void draw line float p0 float p1 float color in C 项目清单 C 和
  • const 和 constexpr 数组之间的区别

    为什么有区别const and constexpr当与数组一起使用时 int const xs 1 2 3 constexpr int ys 1 2 3 int as xs 0 error int bs ys 0 fine 我希望两者都能x
  • 在java中使用BUBBLE SORT对二维字符串数组进行排序

    类似的问题已经被问过 但从来没有关于二维字符串数组 因此在尝试了很长时间之后我找不到我想要的 我正在尝试使用 BubbleSort 对 java 中的 2D 字符串数组进行排序 作为输入 我收到一个二维字符串数组 一个表 以及您应该排序的
  • JSON-LD 构建单个对象数组

    有没有办法将单个对象强制放入数组 每次都测试对象类型真的很烦人 我尝试了这个上下文 但它不起作用 还有JSON LD Playground 中的示例 http tinyurl com ph7p35v 通过此上下文 资源将转换为单个对象 而不
  • Postgres JSONB:数组数组的 where 子句

    postgres 中有 v 9 5 如果有的话 create table json test id varchar NOT NULL data jsonb NOT NULL PRIMARY KEY id 其中 data 是 json 并且包
  • Minizinc:生成有效的转变

    希望有人能帮助我解决这个问题 最初的问题是生成有效的班次 如下所述 我有这样的数组 m m m o o l l m m m l m m m 具有固定长度 S 其中 m 是工作 o 是办公室 我自由了 我需要确保至少每 6m 就有两个 l 在
  • 火花内存不足

    我有一个文件夹 里面有 150 G 的 txt 文件 大约 700 个文件 平均每个 200 MB 我使用 scala 来处理文件并最终计算一些汇总统计数据 我认为有两种可能的方法可以做到这一点 手动循环所有文件 对每个文件进行计算并最终合
  • 如何加速spark df.write jdbc到postgres数据库?

    我是 Spark 新手 正在尝试使用 df write 加速将数据帧的内容 可以有 200k 到 2M 行 附加到 postgres 数据库 df write format jdbc options url psql url spark d
  • 每个术语出现的次数

    我得到了一个数组a n 2 where n can be 10 5最大时有n个科目和n个学生 全部编号为 1 2 n a i 0 and a i 1 1 lt i lt n 表示在第 i 个科目中 所有来自a i 0 to a i 1 通过
  • Numpy - 根据表示一维的坐标向量的条件替换数组中的值

    我有一个data多维数组 最后一个是距离 另一方面 我有距离向量r 例如 Data np ones 20 30 100 r np linspace 10 50 100 最后 我还有一个临界距离值列表 称为r0 使得 r0 shape Dat
  • 了解 Spark 中的 DAG

    问题是我有以下 DAG 我认为当需要洗牌时 火花将工作划分为不同的阶段 考虑阶段 0 和阶段 1 有些操作不需要洗牌 那么为什么 Spark 将它们分成不同的阶段呢 我认为跨分区的实际数据移动应该发生在第 2 阶段 因为这里我们需要cogr
  • 尝试使用 Javascript 解决对称差异

    我正在尝试找出对称的解决方案 使用 javascript 完成以下任务的差异 目标 接受未指定数量的数组作为参数 保留数组中数字的原始顺序 不删除单个数组中数字的重复项 删除数组中出现的重复项 因此 例如 如果输入是 1 1 2 6 2 3
  • 将嵌套字典键值转换为 pyspark 数据帧

    我有一个 Pyspark 数据框 如下所示 我想提取 dic 列中的那些嵌套字典并将它们转换为 PySpark 数据帧 像这样 请让我知道如何实现这一目标 Thanks from pyspark sql import functions a
  • 需要解释搜索最小大和的算法

    我正在解决 Codility 问题作为练习 但无法回答其中一个问题 我在互联网上找到了答案 但我不明白这个算法是如何工作的 有人可以引导我逐步完成它吗 这是问题 You are given integers K M and a non em
  • 如何释放字符指针数组?

    我使用此方法将列表中的值转换为数组 以便在 execvp 系统调用中使用 char list2argarray struct shellvalue values int count char array char malloc count
  • 删除二维数组C++[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 这两种释放二维数组的方法是否相似 int M new int 5 for int i 0 i lt 5 i M i new int 3 fo
  • 如何创建没有循环关系的树形表?

    CREATE TABLE TREE node1 id UUID REFERENCES nodes object id NOT NULL node2 id UUID REFERENCES nodes object id NOT NULL CO
  • 如何将 Dataframe 列名称与 Scala 案例类属性相匹配?

    本示例中的 Spark sql 列名来自case class Person case class Person name String age Int val people RDD Person An RDD of case class o

随机推荐

  • 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