从文件到Spark Dataframe读取Jsons数组

时间:2018-04-24 18:10:20

标签: json scala apache-spark hadoop spark-dataframe

我有一个包含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。

2 个答案:

答案 0 :(得分:0)

您可以使用 file = fopen("encr_affine.txt", "r"); if(file) { while ((c = getc(file)) != EOF) putchar(c); fclose(file); } fgets(str,100,file); if ( fgets(str,100,file) == NULL ) { fprintf(stderr, "Text file corrupted\n"); return -1; } 阅读“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文件并读取解压缩的文件,以充分利用分布式处理体系结构。

答案 1 :(得分:0)

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