【发布时间】:2018-03-31 23:43:24
【问题描述】:
我是 spark 和 scala 的新手。我正在尝试查询 hive 中的表(从表中选择 2 列)并将生成的数据框转换为 Map。我正在使用 Spark 1.6 和 Scala 2.10.6。
例如:
Dataframe:
+--------+-------+
| address| exists|
+--------+-------+
|address1| 1 |
|address2| 0 |
|address3| 1 |
+--------+-------+
should be converted to: Map("address1" -> 1, "address2" -> 0, "address3" -> 1)
这是我正在使用的代码:
val testMap: scala.collection.mutable.Map[String,Any] = Map()
val df= hiveContext.sql("select address,exists from testTable")
qualys.foreach( r => {
val key = r(0).toString
val value = r(1)
testMap+=(key -> value)
}
)
testMap.foreach(println)
当我运行上面的代码时,我得到了这个错误:
java.lang.NoSuchMethodError: scala.Predef$.ArrowAssoc(Ljava/lang/Object;)Ljava/lang/Object;
它在我尝试将键值对添加到 Map 的行中引发此错误。即testMap+=(key -> value)
我知道使用org.apache.spark.sql.functions.map 有更好、更简单的方法。但是,我使用的是 Spark 1.6,我认为此功能不可用。我尝试了import,但在可用函数列表中没有找到它。
为什么我的方法会出错? spark 1.6 有没有更好/更优雅的方法来实现这一点?
任何帮助将不胜感激。谢谢!
更新:
我将元素添加到地图的方式更改为:testMap.put(key, value)。
我之前使用+= 来添加元素。现在我不再收到java.lang.NoSuchMethodError 了。但是,没有元素被添加到testMap。在 foreach 步骤完成后,我尝试打印地图的大小以及其中的所有元素,我看到有 zero 元素。
为什么没有添加元素?我也愿意接受任何其他更好的方法。谢谢!!
【问题讨论】:
-
哦,如果这是您需要的,
org.apache.spark.sql.functions.map无论如何都无关紧要。您只需转换为RDD[(String, Int)]并使用collectAsMap()。您可以找到有关如何将 DataFrame 转换为 RDD 的帖子。 -
这似乎是一个简单的方法!但是,结果将是一个不可变的 Map 对吧?如何将其更改为可变的?
-
你太棒了!请张贴您的 cmets 作为答案,我会接受。非常感谢! :)
标签: scala dictionary apache-spark dataframe collections