火花类型不匹配错误 - 发现:任何但必需:列表[重复]

Posted

技术标签:

【中文标题】火花类型不匹配错误 - 发现:任何但必需:列表[重复]【英文标题】:Spark type mismatch error - found : Any but required: List [duplicate] 【发布时间】:2018-02-03 10:30:48 【问题描述】:

我遇到了从数组自动转换到任意数组的问题。

scala> val selectedFieldsDF = dfFinal.select("id","attributes");
scala> selectedFieldsDF.printSchema
root
 |-- id: long (nullable = true)
 |-- attributes: array (nullable = true)
 |    |-- element: map (containsNull = true)
 |    |    |-- key: string
 |    |    |-- value: string (valueContainsNull = true)

目前数据框只有一条记录:

scala> selectedFieldsDF.show(20, false)
+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|id|attributes                                                                                                                                                                                                                                                                                          |
+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|1425942469761    |[Map(attribute_value -> Bordspellen, column_id -> 2958, attribute_name -> CAT level 2:Soort gezelschapsspellen), Map(attribute_value -> Gezelschapsspellen, column_id -> 2956, attribute_name -> CAT level 1:Soort), Map(attribute_value -> Spelshop.be, column_id -> 47, attribute_name -> Winkel)]|
+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

定义 allItems 类:

scala> case class allItems(id: Long, attr: List[Map[String,String]], valid: Boolean)
    defined class allItems

selectedFieldsDF 使用案例类 allItems 转换为另一个 df

但我面临如下所示的类型不匹配问题,即使 item(1) 是 List[Map[String,String]](您可以在上面看到架构)

scala> val allPreItemsDF = selectedFieldsDF.rdd.map(item=> allItems(toLong(item(0).toString),item(1),true)
     | )
<console>:36: error: type mismatch;
 found   : Any
 required: List[Map[String,String]]
       val allPreItemsDF = selectedFieldsDF.rdd.map(item=> allItems(toLong(item(0).toString),item(1),true)
                                                                                                  ^

【问题讨论】:

你能粘贴到第一个数据框的一些行吗? @shakedzy 粘贴了一行数据框,请查看 @user8371915 感谢您提供参考链接,我在该问题中看到了简单的数据类型,但在我的情况下它是复杂的数据类型,我不知道我必须使用什么来代替 getInt、getLong 方法. getAs[Seq[Map[String,String]]]getSeq[Map[String,String]] item(0)item(1) 等都是Any 类型,请改用getAs[T](0) 【参考方案1】:

你应该使用:

selectedFieldsDF.rdd.map(item=> allItems(item.getLong(0),item.getAs[List[Map[String,String]]](1),true))

使用 Spark 内置的字段转换方法

【讨论】:

它对我有用。非常感谢。

以上是关于火花类型不匹配错误 - 发现:任何但必需:列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

类型不匹配。必需:FirebaseRecyclerAdapter<ChatObject, ChatVoiceViewHolders>?成立:

类型错误:on_message() 缺少 1 个必需的位置参数:“消息”

类型不匹配。必需:布尔值,在 Scala 中找到:Future[Boolean]

对象与目标类型不匹配

UI 测试失败:发现多个匹配错误

重命名两个目录中的文件名如果它们之间的某些字符匹配 - 矢量下标超出范围