从文件到Spark Dataframe读取Jsons数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从文件到Spark Dataframe读取Jsons数组相关的知识,希望对你有一定的参考价值。

我有一个包含JSON数组的gzip压缩文件,如下所示:

[{"Product":{"id"1,"image":"/img.jpg"},"Color":"black"},{"Product":{"id"2,"image":"/img1.jpg"},"Color":"green"}.....]

我知道这不是读入scala的理想数据格式,但是没有其他选择,只能以这种方式处理feed。

我试过了 :

spark.read.json("file-path") 

这似乎需要很长时间(如果你有MB中的数据,过程非常快,但是对于GB的数据而言需要很长时间),可能是因为spark无法拆分文件并将其分配给其他执行程序。

希望看看是否有任何出路来预处理这些数据并将其作为数据帧加载到spark上下文中。

我想要的功能似乎类似于:Create pandas dataframe from json objects。但是我想看看是否有任何可以做类似的scala替代方案并将数据转换为spark RDD / dataframe。

答案

您可以使用spark.read().text("gzip-file-path")阅读“gzip”文件。由于Spark API是基于HDFS API构建的,因此Spark可以读取gzip文件并将其解压缩以读取文件。

https://github.com/mesos/spark/blob/baa30fcd99aec83b1b704d7918be6bb78b45fbb5/core/src/main/scala/spark/SparkContext.scala#L239

但是,gzip是不可拆分的,因此spark会创建一个带有单个分区的RDD。因此,使用spark doe读取gzip文件没有意义。

您可以解压缩gzip文件并读取解压缩的文件以充分利用分布式处理体系结构。

另一答案

看起来像是一个问题,数据格式被赋予火花进行处理。我不得不预先处理数据以将格式更改为火花友好格式,并对其运行spark过程。这是我最终做的预处理:https://github.com/dipayan90/bigjsonprocessor/blob/master/src/main/java/com/kajjoy/bigjsonprocessor/Application.java

以上是关于从文件到Spark Dataframe读取Jsons数组的主要内容,如果未能解决你的问题,请参考以下文章

pyspark建立RDD以及读取文件成dataframe

SparkSQL

从 Redshift 读取到 Spark Dataframe(Spark-Redshift 模块)

赵强老师在Spark SQL中读取JSON文件

在读取/加载时将原始JSON保留为Spark DataFrame中的列?

Spark SQL - 如何将 DataFrame 写入文本文件?