使用Scala将DataSet转换为Json Array Spark

时间:2017-07-24 11:28:05

标签: json scala apache-spark apache-spark-sql apache-spark-dataset

我是新手,无法找出解决以下问题的方法。

我有一个要解析的JSON文件,然后创建一些指标并将数据写回JSON格式。

现在以下是我正在使用的代码

import org.apache.spark.sql._
import org.apache.log4j.{Level, Logger}
import org.apache.spark.sql.functions._

object quick2 {

  def main(args: Array[String]): Unit = {
    Logger.getLogger("org").setLevel(Level.ERROR)
    val spark = SparkSession
      .builder
      .appName("quick1")
      .master("local[*]")
      .getOrCreate()

    val rawData = spark.read.json("/home/umesh/Documents/Demo2/src/main/resources/sampleQuick.json")

    val mat1 = rawData.select(rawData("mal_name"),rawData("cust_id")).distinct().orderBy("cust_id").toJSON.cache()
    val mat2 = rawData.select(rawData("file_md5"),rawData("mal_name")).distinct().orderBy(asc("file_md5")).toJSON.cache()

val write1 = mat1.coalesce(1).toJavaRDD.saveAsTextFile("/home/umesh/Documents/Demo2/src/test/mat1/")

val write = mat2.coalesce(1).toJavaRDD.saveAsTextFile("/home/umesh/Documents/Demo2/src/test/mat2/")
}
}

现在上面的代码正在编写正确的json格式。 但是,矩阵也可能包含重复的结果 例如:

md5   mal_name
1       a
1       b
2       c
3       d
3       e

所以使用上面的代码,每个对象都用单行写入

像这样

{"file_md5":"1","mal_name":"a"}
{"file_md5":"1","mal_name":"b"}
{"file_md5":"2","mal_name":"c"}
{"file_md5":"3","mal_name":"d"}

等等。

但我想结合常用键的数据:

所以输出应该是

{"file_md5":"1","mal_name":["a","b"]}
有人可以建议我在这做什么。或者,如果有任何其他更好的方法来解决这个问题。

谢谢!

2 个答案:

答案 0 :(得分:4)

  
      
  1. 您可以根据collect_list
  2. 的需要使用collect_setmal_name   
  3. 您可以直接将DataFrame / DataSet直接保存为JSON文件
  4.   
import org.apache.spark.sql.functions.{alias, collect_list}
import spark.implicits._

rawData.groupBy($"file_md5")
  .agg(collect_set($"mal_name").alias("mal_name"))
  .write
  .format("json")
  .save("json/file/location/to/save")

答案 1 :(得分:0)

由@mrsrinivas写的我按照下面的方式更改了我的代码

val mat2 = rawData.select(rawData("file_md5"),rawData("mal_name")).distinct().orderBy(asc("file_md5")).cache()
val labeledDf = mat2.toDF("file_md5","mal_name")
labeledDf.groupBy($"file_md5").agg(collect_list($"mal_name")).coalesce(1).write.format("json").save("/home/umesh/Documents/Demo2/src/test/run8/")

如果有任何更多的建议,请保持这个问题。