Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.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
Spark聚合JSON输入文件中的键,并将值输出到新的JSON文件_Json_Scala_Apache Spark_Aggregation - Fatal编程技术网

Spark聚合JSON输入文件中的键,并将值输出到新的JSON文件

Spark聚合JSON输入文件中的键,并将值输出到新的JSON文件,json,scala,apache-spark,aggregation,Json,Scala,Apache Spark,Aggregation,我在一个目录中有如下结构的JSON文件 { { "cts":1456877408861, "ts":1456877408861, "spn":"rootspan" }, { "cts":1456877408862, "ts":1456877408862, "spn":"lowspan" } } 我想在一个新文件中使用Spark Scala获得如下输出。我怎样才能做到这一点 { "cts":2, "ts":2, "spn":2 } 这就是我试过的 val

我在一个目录中有如下结构的JSON文件

{
 {
  "cts":1456877408861,
  "ts":1456877408861,
  "spn":"rootspan"
 },
 {
  "cts":1456877408862,
  "ts":1456877408862,
  "spn":"lowspan"
 }
}
我想在一个新文件中使用Spark Scala获得如下输出。我怎样才能做到这一点

{
 "cts":2,
 "ts":2,
 "spn":2
}
这就是我试过的

val conf = new SparkConf().setAppName("Argos Aggregator")
val sc = new SparkContext(conf)
setHadoopConfiguration(sc)
val sqlContext = new SQLContext(sc) 
val logData = sc.sequenceFile(inputFilePath, classOf[LongWritable], classOf[BytesWritable])
val rawJsonStringMap = logData.map{case (k,v) => (new String(v.copyBytes()))}
//jsonmap has json structure that i gave above
val jsonMap = sqlContext.read.json(rawJsonStringMap)
val schema = jsonMap.dtypes
jsonMap.show()
for (s <- schema) {
    val colName = s._1
    var rawColCount = jsonMap.select(colName).count()
    println("type = "+colName+ " Count = " + rawColCount)
}
val conf=new SparkConf().setAppName(“Argos聚合器”)
val sc=新的SparkContext(配置)
SetHadoop配置(sc)
val sqlContext=新的sqlContext(sc)
val logData=sc.sequenceFile(inputFilePath,classOf[LongWritable],classOf[ByteWritable])
val rawJsonStringMap=logData.map{case(k,v)=>(新字符串(v.copyBytes())}
//jsonmap具有我在上面给出的json结构
val jsonMap=sqlContext.read.json(rawJsonStringMap)
val schema=jsonMap.dtypes
jsonMap.show()
为了
首先,您提供的json是无效的
像这样的

您可以编写一个udf来迭代json数组中的每个对象,然后 为每个字段设置计数器

您可以在读取json文件后调用udf

最终输出: {“输出”:{“cts”:2,“ts”:2,“spn”:2}

首先,您提供的json是无效的 像这样的

您可以编写一个udf来迭代json数组中的每个对象,然后 为每个字段设置计数器

您可以在读取json文件后调用udf

最终输出: {“输出”:{“cts”:2,“ts”:2,“spn”:2}


告诉我们,你有没有尝试过什么让我们有一个起点?刚刚更新了主帖子。告诉我们,你有没有尝试过什么让我们有一个起点?刚刚更新了主帖子。
{
  "data": [
    {
      "cts": 1456877408861,
      "ts": 1456877408861,
      "spn": "rootspan"
    },
    {
      "cts": 1456877408862,
      "ts": 1456877408862,
      "spn": "lowspan"
    }
  ]
}
def countData = udf((inputData:Seq[Row]) =>{
        var ctsCount = 0
        var tsCount = 0
        var spnCount = 0
        inputData.foreach(line => {
        if(line.getAs[String](0) != null)  ctsCount += 1
          if(line.getAs[String](1) != null) tsCount += 1
          if(line.getAs[String](2) != null) spnCount += 1
        })
        Map("cts" -> ctsCount,"ts" -> tsCount,"spn" -> spnCount)
      })
val input = sqlContext.read.json("test.json")
val finalData = input.withColumn("output",countData(input("data"))).drop("data")
finalData.toJSON.foreach(println)