当前位置: 首页 > 知识库问答 >
问题:

Spark:对字段的引用不明确

艾璞瑜
2023-03-14

我在尝试展平高度嵌套的结构时遇到以下错误:

组织。阿帕奇。火花sql。AnalysisException:对字段StructField(错误、StructType(数组、ArrayType(StructType(double,DoubleType,true)、StructField(int,IntegerType,true)、StructField(string,StringType,true))、true、StructField(double,DoubleType,true)、StructField(int,IntegerType,true)、StructField(string,StringType,true)的引用不明确,StructField(struct,StructType(消息,StringType,true),StructField(种类,StringType,true),StructField(堆栈,StringType,true)),true),StructField(错误,StructType(数组,ArrayType(StringType,true),true),StructField(字符串,StringType,true)),true)

我似乎不知道是什么原因导致了这种情况。除了深层嵌套结构之外,还有什么不明确之处?

共有1个答案

楚钊
2023-03-14

当您在两个数据帧之间进行连接,并且两个数据帧都有一个同名字段时,就会发生这种情况。当您调用复制字段时,Spark不知道您请求的是哪一列。解决方案:在连接的一侧重命名字段,就完成了。实例

  • dfA是一个具有2列的数据帧=

您要按列“id”连接两个数据帧,并且要选择第二个中的“name”列:

val dfJoined = dfA.join(dfB,Seq("id"),"inner").select("name")

由于列“name”存在于两个数据框中,Spark无法识别您要求的是哪个“name”。

解决方案:

val dfRenamedB = dfB.withColumnRenamed("name","b_name")

现在,当您加入这两个数据帧时,您将得到“name”和“b\u name”列,并且您可以确定哪一个是所选的。

 类似资料:
  • 我已经设置了自动加载器来定期读取json文件,并使用Database ricks中的Delta Live Tables将它们存储在一个名为fixture_raw的“青铜”表中。这很好用,json数据存储在指定的表中,但是当我添加一个名为fixture_prepared的“银”表并尝试从青铜表中提取一些json元素时,我收到一个错误: 我该如何解决这个问题? Delta Live Table代码:

  • 给定下面用Mockito模拟Scala类的代码,我会得到一个错误并且无法编译: 错误是: 对重载定义的引用不明确,类型为(x$1:class[common.testeable],x$2:org.Mockito.mocksettings)的对象Mockito中的方法mock和类型为(x$1:class[common.testeable],x$2:org.Mockito.stubbing.answhe

  • 为什么我有这个错误? 错误:(5,18)对重载定义的引用不明确,类型为(x$1:String)布尔的类String中的方法startsWith和类型为(x$1:String,x$2:Int)布尔的类String中的方法startsWith匹配预期的类型?水果过滤器(_.startswith==“AP”) 水果过滤器(_.startswith==“AP”)

  • 问题内容: 我正在尝试获取离开此评论的用户的用户信息。 使用以下代码: 我得到了错误: 字段列表中的“ user_id”列不明确 这是什么意思? 问题答案: 这意味着查询中的两个表都具有column 。 您需要在SELECT语句中指定要获取的对象,例如

  • 问题内容: 我有2张桌子。并且两者都有。如何选择字段,因为我总是会收到此错误: 这是我的查询: 我可以选择所有字段并避免错误。但这将浪费性能。我该怎么办? 问题答案: SQL通过给引用加上完整的表名作为前缀来支持对列进行限定: …或表别名: 推荐使用表别名-为什么键入的文字比您需要的多? 为什么这些查询看起来不同? 其次,我的答案使用ANSI-92 JOIN语法(您使用的是ANSI-89)。尽管它

  • 问题内容: 在没有泛型类型的类中,我想声明一个类似于以下内容的相当复杂的泛型字段: 问题是Java编译器不会让我:) 所以我的问题是如何正确地引入T和S,而又不向类Client添加类型。 我的目标是强制成为您选择的类的子类型和作为子类。 问题答案: 你不能 唯一的选择是在类声明中声明泛型类型参数。如果您的类没有泛型类型参数,则其成员不能为泛型。您必须在类成员的声明中使用实际类型。