首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hashtable[String,String]的Scala错误

问Hashtable[String,String]的Scala错误
EN

Stack Overflow用户
提问于 2020-01-20 05:46:30
回答 1查看 77关注 0票数 0

我正在写一个小的UDF

代码语言:javascript
复制
  val transform = udf((x: Array[Byte]) => {

    val mapper = new ObjectMapper() with ScalaObjectMapper
    val stream: InputStream  = new ByteArrayInputStream(x);
    val obs = new ObjectInputStream(stream)

    val stock = mapper.readValue(obs, classOf[util.Hashtable[String, String]])
    stock
  })

我在哪里得到错误

代码语言:javascript
复制
java.lang.UnsupportedOperationException: Schema for type java.util.Hashtable[String,String] is not supported
  at org.apache.spark.sql.catalyst.ScalaReflection$$anonfun$schemaFor$1.apply(ScalaReflection.scala:809)
  at org.apache.spark.sql.catalyst.ScalaReflection$$anonfun$schemaFor$1.apply(ScalaReflection.scala:740)
  at scala.reflect.internal.tpe.TypeConstraints$UndoLog.undo(TypeConstraints.scala:56)
  at org.apache.spark.sql.catalyst.ScalaReflection$class.cleanUpReflectionObjects(ScalaReflection.scala:926)
  at org.apache.spark.sql.catalyst.ScalaReflection$.cleanUpReflectionObjects(ScalaReflection.scala:49)
  at org.apache.spark.sql.catalyst.ScalaReflection$.schemaFor(ScalaReflection.scala:739)
  at org.apache.spark.sql.catalyst.ScalaReflection$.schemaFor(ScalaReflection.scala:736)
  at org.apache.spark.sql.functions$.udf(functions.scala:3898)
  ... 59 elided

有没有人能帮助我们理解为什么会这样呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-20 17:49:14

你得到的错误只是意味着Spark不理解java哈希表。我们可以用这个简单的UDF重现你的错误。

代码语言:javascript
复制
val gen = udf(() => new java.util.Hashtable[String, String]())

Spark试图从一个java.util.Hashtable创建一个DataType (放在一个spark模式中),它不知道怎么做。不过,Spark理解scala地图。实际上,下面的代码

代码语言:javascript
复制
val gen2 = udf(() => Map("a" -> "b"))
spark.range(1).select(gen2()).show()

收益率

代码语言:javascript
复制
+--------+
|   UDF()|
+--------+
|[a -> b]|
+--------+

要修复第一个UDF,顺便提一下,您可以将Hashtable转换为scala map。使用JavaConverters可以很容易地完成HashMap转换。我不知道用Hashtable做这件事有什么简单的方法,但你可以这样做:

代码语言:javascript
复制
import collection.JavaConverters._
val gen3 = udf(() => {
    val table = new java.util.Hashtable[String, String]()
    table.put("a", "b")
    Map(table.entrySet.asScala.toSeq.map(x => x.getKey -> x.getValue) :_*)
})
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59814697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档