Scala Spark读json

时间:2017-07-18 04:06:03

标签: json scala apache-spark

我的代码如下

val sparkConf = new SparkConf().setAppName("Json Test").setMaster("local[*]") 
val sc = new SparkContext(sparkConf) 
val sqlContext = new org.apache.spark.sql.SQLContext(sc) 
import sqlContext.implicits._

val path = "/path/log.json" 
val df = sqlContext.read.json(path)
df.show()

示例json数据

{ “IFAM”: “EQR”, “KTM”:1430006400000 “COL”:21, “DATA”:[{ “MLrate”: “30”, “Nrout”: “0”, “上”: null,“Crate”:“2”},{“MLrate”:“31”,“Nrout”:“0”,“up”:null,“Crate”:“2”},{“MLrate”:“30 “ ”Nrout“: ”5“, ”上“:NULL, ”板条箱“: ”2“},{ ”MLrate“: ”34“, ”Nrout“: ”0“, ”上“:NULL,” 板条箱“:” 4 “},{” MLrate “:” 33" , “Nrout”: “0”, “上”:NULL, “板条箱”: “2”},{ “MLrate”: “30”,“Nrout “:” 8" , “上”:NULL, “板条箱”: “2”}]}

在scala ide发生错误时,我无法理解:

  

INFO SharedState:仓库路径是   '文件:/ C:/用户/ ben53 /工作区/演示/火花仓库/'。例外   线程“main”java.util.ServiceConfigurationError:   org.apache.spark.sql.sources.DataSourceRegister:Provider   org.apache.spark.sql.hive.orc.DefaultSource无法实例化     在java.util.ServiceLoader.fail(未知来源)at   java.util.ServiceLoader.access $ 100(未知来源)at   java.util.ServiceLoader $ LazyIterator.nextService(未知来源)at   java.util.ServiceLoader $ LazyIterator.next(未知来源)at   java.util.ServiceLoader $ 1.next(未知来源)at   scala.collection.convert.Wrappers $ JIteratorWrapper.next(Wrappers.scala:43)     在scala.collection.Iterator $ class.foreach(Iterator.scala:893)at   scala.collection.AbstractIterator.foreach(Iterator.scala:1336)at   scala.collection.IterableLike $ class.foreach(IterableLike.scala:72)at   scala.collection.AbstractIterable.foreach(Iterable.scala:54)at   scala.collection.TraversableLike $ class.filterImpl(TraversableLike.scala:247)     在   scala.collection.TraversableLike $ class.filter(TraversableLike.scala:259)     在scala.collection.AbstractTraversable.filter(Traversable.scala:104)     在   org.apache.spark.sql.execution.datasources.DataSource $ .lookupDataSource(DataSource.scala:575)     在   org.apache.spark.sql.execution.datasources.DataSource.providingClass $ lzycompute(DataSource.scala:86)     在   org.apache.spark.sql.execution.datasources.DataSource.providingClass(DataSource.scala:86)     在   org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:325)     在   org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:152)     在   org.apache.spark.sql.DataFrameReader.json(DataFrameReader.scala:298)     在   org.apache.spark.sql.DataFrameReader.json(DataFrameReader.scala:251)     在com.dataflair.spark.QueryLog $ .main(QueryLog.scala:27)at   com.dataflair.spark.QueryLog.main(QueryLog.scala)引起:   java.lang.VerifyError:错误的返回类型异常详细信息:位置:       组织/阿帕奇/火花/ SQL /蜂巢/兽人/ DefaultSource.createRelation(Lorg /阿帕奇/火花/ SQL / SQLContext; [Ljava /郎/字符串; Lscala /尺码; Lscala /尺码; Lscala /收集/不可改变/地图;) Lorg /阿帕奇/火花/ SQL /来源/ HadoopFsRelation;   @ 35:areturn原因:       输入'org / apache / spark / sql / hive / orc / OrcRelation'(当前帧,堆栈[0])不能分配给   'org / apache / spark / sql / sources / HadoopFsRelation'(来自方法   签名)当前框架:       bci:@ 35       旗帜:{}       locals:{'org / apache / spark / sql / hive / orc / DefaultSource','org / apache / spark / sql / SQLContext','[Ljava / lang / String;',   'scala / Option','scala / Option','scala / collection / immutable / Map'}       stack:{'org / apache / spark / sql / hive / orc / OrcRelation'}字节码:       0x0000000:b200 1c2b c100 1ebb 000e 592a b700 22b6       0x0000010:0026 bb00 2859 2c2d b200 2d19 0419 052b       0x0000020:b700 30b0

     

at java.lang.Class.getDeclaredConstructors0(Native Method)at   java.lang.Class.privateGetDeclaredConstructors(未知来源)at   java.lang.Class.getConstructor0(未知来源)at   java.lang.Class.newInstance(Unknown Source)... 20多个

     

2 个答案:

答案 0 :(得分:1)

路径应该是正确的。但是提供的JSON无效。请更正示例JSON,然后尝试。 您可以在https://jsonlint.com/

上验证JSON

它显示了JSON的无效部分。

虽然我尝试了样本并获得了如下输出:

    +---+--------------------+----+-------------+
|COL|                DATA|IFAM|          KTM|
+---+--------------------+----+-------------+
| 21|[[2,30,0,null], [...| EQR|1430006400000|
+---+--------------------+----+-------------+

使用的代码如下:

object Test {

  def main(args: Array[String]) {
    val sparkConf = new SparkConf().setAppName("Json Test").setMaster("local[*]")
    val sc = new SparkContext(sparkConf)
    val sqlContext = new org.apache.spark.sql.SQLContext(sc)
    import sqlContext.implicits._

    val path = "/home/test/Desktop/test.json"
    val df = sqlContext.read.json(path)
    df.show()
  }
}

答案 1 :(得分:0)

我很确定你的道路不对。检查文件是否存在于指定的路径中。 Json是有效的。