阅读JSON使用火花和Scala

问题描述:

一个文本文件,里面我有一个具有JSON数据是这样的一个文本文件:阅读JSON使用火花和Scala

​​

所有JSON是新线分离。

我想所有的文本文件中的数据加载到一个临时的看法:

sqlContext.read.textFiles("/path").createOrReplaceTempView("result") 

val data = sqlContext.sql("select * from result").collect() 

结果:

[{"element" : value,"id" : value,"total" : [] }] 
[{"element" : value,"id" : value, "total" : []}] 

我需要提取的ID和与之相关的总。

火花有办法解决这个问题吗?与json数据作为

​​

+0

您还可以添加从“结果”视图中显示数据时得到的结果 –

火花SQL每行必须包含一个单独的,独立的有效JSON,否则计算失败。

不过你可以试试这个

spark.read.json(spark.sparkContext.wholeTextFiles("path to json").values) 

spark.read.option("wholeFile", true).option("mode", "PERMISSIVE").json("path to json") 

这应该在JSON转换成数据帧。

+0

这是什么意思?你是指json内部的值? – abhi5800

+0

spark.sparkContext.wholeTextFiles(“path to json”)将返回一个RDD .values,并从中选择rdd的值。答案与选项火花2.2 –

+0

谢谢男人!!它像一个魅力.. :) :)(2.2版帮助..) – abhi5800

给定的输入文件是一个有效的JSON转换为一个dataframe,所以你必须将数据转换成有效火花可读JSON格式。如果你有值的字符串没有元素和id字段引号

val rdd = sc.wholeTextFiles("path to the json file") 

val validJsonRdd = rdd.flatMap(_._2.replace(" ", "").replace("\n", "").replace(":value", ":\"value\"").replace("}{", "}\n{").split("\n")) 

上述步骤只会工作。否则,您可以根据自己的需要进行修改。

下一步是使用sqlcontext转换为dataframe

val df = sqlContext.read.json(validJsonRdd) 

这将导致以

+-------+-----+-----+ 
|element|id |total| 
+-------+-----+-----+ 
|value |value|[] | 
|value |value|[] | 
+-------+-----+-----+ 

现在你应该能够选择id和各自totals和他们一起玩

我希望答案是有帮助的

+0

@这适用于小数据集。但是,如果数据集很大。将所有数据转换为有效的JsonRDD将花费大量时间。 – abhi5800

+0

由于我的文本文件已经定义了json对象。我不能直接阅读它们吗? – abhi5800

+0

你可以但你必须写一个JSON解析器,因为Spark不支持你拥有的JSON类型。 – philantrovert

添加到这一点,因为它花了一些时间去了解它,查询一些嵌套totals时,您可能需要使用“爆炸”的方法:

Dataset<Row> socials = sparkSession 
      .read() 
      .option("multiLine", true) 
      .option("mode", "PERMISSIVE") 
      .json(<path to file>).cache(); 

socials.select(org.apache.spark.sql.functions.explode(socials.col("total")).as("t")).where("t.<some nested column under total> = 'foo'").toJSON().collectAsList(); 

这是Java火花但希望爆炸的方法会有一些帮助。