Ошибка, которую вы получаете, просто означает, что Spark не понимает java га sh таблиц. Мы можем воспроизвести вашу ошибку с помощью этого простого UDF
.
val gen = udf(() => new java.util.Hashtable[String, String]())
Spark пытается создать DataType
(вставить схему искры) из java.util.Hashtable
, который он не знает, как делать. Spark понимает карты scala. Действительно, следующий код
val gen2 = udf(() => Map("a" -> "b"))
spark.range(1).select(gen2()).show()
дает
+--------+
| UDF()|
+--------+
|[a -> b]|
+--------+
Чтобы исправить первую UDF
, кстати, свою, вы можете преобразовать Hashtable в карту scala. Преобразование HashMap
можно легко сделать с помощью JavaConverters
. Я не знаю ни одного простого способа сделать это с Hashtable
, но вы можете сделать это следующим образом:
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) :_*)
})