我正在尝试处理AWS EMR Spark群集中的数据。为此,我有一个Scala应用程序从S3读取原始JSON数据,使用Scala的本机 scala.util.parsing.json.JSON 库将其解析为Map [String,Any]和 parseFull 方法。
然后我有一个递归函数,它使嵌套的JSON变平(所以Map [String,Any]里面不包含任何Maps)然后我想把它转换回JSON格式的字符串来创建一个Spark DataFrame对象
为了将Map对象解析为JSON字符串,我找到了mohit的this解决方案。
不幸的是,我的IntelliJ中的org.json4s.native库存在一些问题,它说它无法解决这种依赖关系。 (事后看来,我现在知道在使用正确的依赖项更新.sbt文件后没有刷新项目的问题。现在在IntelliJ中json4s.native库及其功能正常工作。)
首先,我使用了org.json4s.jackson.Json。但那么
Json(DefaultFormats).write(m)
行产生一个字符串,其中整数转换为双精度,这是不正确的。
然后我让我的IntelliJ使用json4s.native库并且结果转换成数字正确。
但是,现在,我在Spark群集中使用此库时遇到问题。如果我在本地构建.jar,将文件上传到S3,将其复制到EMR集群,然后使用spark-submit运行它,我收到以下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: org/json4s/native/Json$
当我尝试从spark-shell导入这个库时,我只是得到了这个依赖性无法解决的响应。
我试图通过尝试手动将json4s-native jar文件放到群集中来尝试Eli Leszczynski的this建议,但他建议的 / home / hadoop / lib 不能用作/当我登录hadoop@blabla.compute.amazonaws.com时,home / hadoop是一个基本上空的文件夹。
我发现我的库可以在 / usr / lib 或 / usr / lib / hadoop / lib 文件夹中找到,但我在那里复制了jar文件但仍然我自己的剧本失败了。
那么,如何在我的Amazon EMR Spark群集中使用 org.json4s.native 库?
(Spark版本1.6和我使用Scala版本2.10.5,因为它与Spark版本兼容)