在火花中解析json

时间:2017-01-04 03:12:55

标签: scala apache-spark apache-spark-sql apache-spark-2.0

我正在使用json scala库来解析spark job中的本地驱动器中的json:

val requestJson=JSON.parseFull(Source.fromFile("c:/data/request.json").mkString)
    val mainJson=requestJson.get.asInstanceOf[Map[String,Any]].get("Request").get.asInstanceOf[Map[String,Any]]
    val currency=mainJson.get("currency").get.asInstanceOf[String]

但是当我尝试通过指向hdfs文件位置来使用相同的解析器时,它不起作用:

val requestJson=JSON.parseFull(Source.fromFile("hdfs://url/user/request.json").mkString)

并给我一个错误:

java.io.FileNotFoundException: hdfs:/localhost/user/request.json (No such file or directory)
  at java.io.FileInputStream.open0(Native Method)
  at java.io.FileInputStream.open(FileInputStream.java:195)
  at java.io.FileInputStream.<init>(FileInputStream.java:138)
  at scala.io.Source$.fromFile(Source.scala:91)
  at scala.io.Source$.fromFile(Source.scala:76)
  at scala.io.Source$.fromFile(Source.scala:54)
  ... 128 elided

如何使用Json.parseFull库从hdfs文件位置获取数据?

由于

3 个答案:

答案 0 :(得分:1)

Spark确实有一个内置的JSON文档解析支持,可以在spark-sql_${scala.version} jar中使用。

在Spark 2.0+中:

import org.apache.spark.sql.SparkSession 

val spark: SparkSession = SparkSession.builder.master("local").getOrCreate

val df = spark.read.format("json").json("json/file/location/in/hdfs")

df.show()

使用df对象,您可以对其执行所有受支持的SQL操作,并且数据处理将在节点之间分发,而requestJson  将仅在一台机器上计算。

Maven依赖

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-sql_2.11</artifactId>
    <version>2.0.0</version>
</dependency>
  

编辑(根据评论从hdfs读取文件)

val hdfs = org.apache.hadoop.fs.FileSystem.get(
             new java.net.URI("hdfs://ITS-Hadoop10:9000/"), 
             new org.apache.hadoop.conf.Configuration()
           )
val path=new Path("/user/zhc/"+x+"/")
val t=hdfs.listStatus(path)
val in =hdfs.open(t(0).getPath)
val reader = new BufferedReader(new InputStreamReader(in))
var l=reader.readLine()
     

code credits: from another SO question

     

Maven依赖项:

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-hdfs</artifactId>
    <version>2.7.2</version> <!-- you can change this as per your hadoop version -->
</dependency>

答案 1 :(得分:1)

火花2.0更容易

val df = spark.read.json("json/file/location/in/hdfs")
df.show()

答案 2 :(得分:0)

可以在Spark中使用以下命令从HDFS读取文件: val jsonText = sc.textFile(“ hdfs://url/user/request.json”).collect.mkString(“ \ n”)

相关问题