阅读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
数据作为
火花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转换成数据帧。
给定的输入文件是不一个有效的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
和他们一起玩
我希望答案是有帮助的
@这适用于小数据集。但是,如果数据集很大。将所有数据转换为有效的JsonRDD将花费大量时间。 – abhi5800
由于我的文本文件已经定义了json对象。我不能直接阅读它们吗? – abhi5800
你可以但你必须写一个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火花但希望爆炸的方法会有一些帮助。
您还可以添加从“结果”视图中显示数据时得到的结果 –