Spark聚合JSON输入文件中的键,并将值输出到新的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
{
{
"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)