Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Scala将数据集转换为Json数组Spark_Json_Scala_Apache Spark_Apache Spark Sql_Apache Spark Dataset - Fatal编程技术网

使用Scala将数据集转换为Json数组Spark

使用Scala将数据集转换为Json数组Spark,json,scala,apache-spark,apache-spark-sql,apache-spark-dataset,Json,Scala,Apache Spark,Apache Spark Sql,Apache Spark Dataset,我对spark是新手,无法找到以下问题的解决方案 我有一个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 = { Log

我对spark是新手,无法找到以下问题的解决方案

我有一个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格式。 但是,矩阵也可以包含重复的结果 例如:

因此,使用上面的代码,每个对象都将被写在一行中

像这样

{"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"]}
有人能建议我在这里做什么吗。或者是否有其他更好的方法来解决这个问题

谢谢

您可以根据需要在“名称”列中使用“收集列表”或“收集集合” 您可以直接将DataFrame/DataSet保存为JSON文件 您可以根据需要在“名称”列中使用“收集列表”或“收集集合” 您可以直接将DataFrame/DataSet保存为JSON文件
正如@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/")

保持此问题的开放性,以获得更多建议。

如@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/")

保持此问题处于打开状态以获取更多建议(如果有)。

.aggcollect\u list$mal\u name.aliasmal\u name应该可以避免您创建新列。您好,试用的alias不起作用,出现了一个错误,当我尝试使用时,它起作用了。val labeledDf=mat1.groupBy$file_md5.aggcollect_set$mal_name.asmal_name.aggcollect_list$mal_name.aliasmal_name应避免您创建新列。您好,试用的别名不起作用,我尝试使用时出现错误。val labeledDf=mat1.groupBy$file\u md5.aggcollect\u set$mal\u name.asmal\u name
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/")