火花类型不匹配错误 - 发现:任何但必需:列表[重复]
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 个必需的位置参数:“消息”