使用Scala将数据集转换为Json数组Spark
我对spark是新手,无法找到以下问题的解决方案 我有一个JSON文件要解析,然后创建几个指标,并将数据写回JSON格式 下面是我正在使用的代码使用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
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/")