Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.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_Json_Scala_Apache Spark_Nested - Fatal编程技术网

使用SCALA解析嵌套JSON

使用SCALA解析嵌套JSON,json,scala,apache-spark,nested,Json,Scala,Apache Spark,Nested,我希望注入遥测数据,输出是一个多层嵌套JSON文件。我对非常特定的字段感兴趣,但我无法解析JSON文件以获取数据 数据样本: {“version_str”:“1.0.0”,“node_id_str”:“router-01”,“encoding_path”: “sys/intf”、“采集id”:241466,“采集开始时间”:0, “集合结束时间”:0,“消息时间戳”:0,“订阅id”:[], “传感器组id”:[],“数据源”:“DME”,“数据”:{ “interfaceEntity”:{“a

我希望注入遥测数据,输出是一个多层嵌套JSON文件。我对非常特定的字段感兴趣,但我无法解析JSON文件以获取数据

数据样本:

{“version_str”:“1.0.0”,“node_id_str”:“router-01”,“encoding_path”: “sys/intf”、“采集id”:241466,“采集开始时间”:0, “集合结束时间”:0,“消息时间戳”:0,“订阅id”:[], “传感器组id”:[],“数据源”:“DME”,“数据”:{ “interfaceEntity”:{“attributes”:{“childAction”:“descr”:”, “dn”:“sys/intf”,“modTs”:“2017-09-19T13:24:14.751+00:00”, “monPolDn”:“uni/fabric/monfab default”,“persistentonoreload”:“true”, “状态”:“}”,子项:[{“l3LbRtdIf”:{“属性”:{ “管理员”:“向上”、“子操作”:“描述”:“无”、“id”: “lo103”、“链接日志”:“默认”、“修改”: “2017-11-06T23:18:02.974+00:00”,“monPolDn”: “uni/fabric/monfab默认值”、“名称”:“persistentOnReload”:“true”, “rn”:“lb-[lo103],“状态”:“uid”:“0”},“子项”:[{ “ethpmLbRtdIf”:{“属性”:{“curerrindex”:“4294967295”, “ifIndex”:“335544423”,“iod”:“14”,“lastErrors”:“0,0,0,0”, “operBitset”:“operDescr”:“Nothing”,“operMtu”:“1500”, “operSt”:“up”,“operStQual”:“none”,“rn”:“lbrtdif”}}{ “nwRtVrfMbr”:{“属性”:{“childAction”:“,”l3vmCfgFailedBmp”: “,”l3vmCfgFailedTs:“00:00:00.000”,“l3vmCfgState:“0”, “modTs”:“2017-11-06T23:18:02.945+00:00”,“monPolDn”:”, “parentSKey”:“未指定”,“persistentUnreload”:“true”,“rn”: “rtvrfMbr”、“状态”:”、“tCl”:“l3Inst”、“tDn”:“系统/仪器默认值”, “tSKey”:“}}}]},{“l3LbRtdIf”:{“属性”:{“管理员”: “up”、“childAction”:“descr”:“Nothing”、“id”:“lo104”, “链接日志”:“默认”,“修改”:“2018-01-25T15:54:20.367+00:00”, “monPolDn”:“uni/fabric/monfab default”,“name”:”, “PersistentUnreload”:“true”,“rn”:“lb-[lo104]”,“status”:“uid”: “0”},“子项”:[{“ethpmLbRtdIf”:{“属性”:{ “当前索引”:“4294967295”,“ifIndex”:“335544424”,“iod”:“77”, “lastErrors”:“0,0,0,0”,“operBitset”:“operDescr”: “无”、“操作”:“1500”、“操作”:“向上”、“操作质量”: “无”、“rn”:“lbrtdif”}},{“nwRtVrfMbr”:{“属性”:{ “子操作”:“l3vmCfgFailedBmp”:“l3vmCfgFailedTs”: “00:00:00:00.000”、“l3vmCfgState”:“0”、“modTs”: “2018-01-25T15:53:55.757+00:00”,“monPolDn”:“parentSKey”: “未指定”、“持续重新加载”:“真”、“rn”:“rtvrfMbr”, “状态”:”“tCl”:“l3Inst”,“tDn”:“系统/安装默认值”,“tSKey”:” }}}]},{“l3LbRtdIf”:{“属性”:{“管理”:“向上”, “childAction”:“descr”:“Nothing”,“id”:“lo101”, “链接日志”:“默认”,“修改”:“2017-11-13T21:39:58.910+00:00”, “monPolDn”:“uni/fabric/monfab default”,“name”:”, “PersistentUnreload”:“true”,“rn”:“lb-[lo101]”,“status”:“uid”: “0”},“子项”:[{“ethpmLbRtdIf”:{“属性”:{ “当前索引”:“4294967295”,“ifIndex”:“335544421”,“iod”:“12”, “lastErrors”:“0,0,0,0”,“operBitset”:“operDescr”: “无”、“操作”:“1500”、“操作”:“向上”、“操作质量”: “无”、“rn”:“lbrtdif”}},{“nwRtVrfMbr”:{“属性”:{ “子操作”:“l3vmCfgFailedBmp”:“l3vmCfgFailedTs”: “00:00:00:00.000”、“l3vmCfgState”:“0”、“modTs”: “2017-11-13T21:39:58.880+00:00”,“monPolDn”:“parentSKey”: “未指定”、“持续重新加载”:“真”、“rn”:“rtvrfMbr”, “状态”:”“tCl”:“l3Inst”,“tDn”:“系统/安装默认值”,“tSKey”:” }}}]},{“l3LbRtdIf”:{“属性”:{“管理”:“向上”, “childAction”:“descr”:“\”^:tier2:if:环回:管理:l3\”,“id”: “lo0”,“链接日志”:“默认”,“修改”:“2017-09-25T20:29:54.003+00:00”, “monPolDn”:“uni/fabric/monfab default”,“name”:”, “PersistentUnreload”:“true”,“rn”:“lb-[lo0]”,“status”:“uid”: “0”},“子项”:[{“ethpmLbRtdIf”:{“属性”:{ “当前索引”:“4294967295”,“ifIndex”:“335544320”,“iod”:“11”, “lastErrors”:“0,0,0,0”,“operBitset”:“operDescr”: “\”^:tier2:if:loopback:mgmt:l3\”,“operMtu”:“1500”,“operSt”:“up”, “operStQual”:“无”,“rn”:“lbrtdif”}}},{“nwRtVrfMbr”:

我对这些属性感兴趣:

|    |    |    |    |    |    |    |-- rmonIfIn: struct (nullable = true)
|    |    |    |    |    |    |    |    |-- attributes: struct (nullable = true                                                                                        )
|    |    |    |    |    |    |    |    |    |-- broadcastPkts: string (nullabl                                                                                        e = true)
|    |    |    |    |    |    |    |    |    |-- discards: string (nullable = t                                                                                        rue)
|    |    |    |    |    |    |    |    |    |-- errors: string (nullable = tru                                                                                        e)
|    |    |    |    |    |    |    |    |    |-- multicastPkts: string (nullabl                                                                                        e = true)
|    |    |    |    |    |    |    |    |    |-- nUcastPkts: string (nullable =                                                                                         true)
|    |    |    |    |    |    |    |    |    |-- packetRate: string (nullable =                                                                                         true)
当我试图深入研究时,我不断得到一个错误,我不断得到数据类型错误:

stringJsonDF: org.apache.spark.sql.DataFrame = [nestDevice: string]
org.apache.spark.sql.AnalysisException: cannot resolve '`data`.`InterfaceEntity`.`children`.`l1PhysIf`.`children`['element']' due to data type mismatch: argument 2 requires integral type, however, ''element'' is of string type.;;

您可以使用用于处理json的Google Gson库。您可以将任何对象转换为json,当然也可以反向转换。下面是一个这样做的示例:

Gson gson = new Gson();
List<Map<Long, String>> listOfMaps = new ArrayList<>();
//here you can new some maps and add them to the listOfMaps. 
String listOfMapsInJsonFormat = gson.toJson(listOfMaps);
上面的代码会将您的输入json字符串更改为包含映射的列表。当然,在将原始对象转换为json之前,您拥有的映射类型可能会有所不同,而gson会从json字符串构建对象。为了避免这种情况,您可以使用TypeToken类:

Gson gson = new Gson();
Type type = new TypeToken()<ArrayList<Map<>>>{}.getType();
ArrayList<Map<>> = gson.fromJson(listOfMapsInJsonFormat, type);
Gson-Gson=new-Gson();
Type Type=new-TypeToken(){}.getType();
ArrayList=gson.fromJson(ListOfMopsinsonFormat,类型);

由于字段是多个嵌套数组的一部分,因此逻辑将假定您对每个记录中这些字段的所有迭代都感兴趣(因此,如果一个记录包含n个嵌套数组导致的rmonIfIn项,则您会对每个项感兴趣?)

如果是这样的话,
分解这些嵌套数组并处理扩展的数据帧是有意义的

根据您的代码和不完整的json示例,它可能如下所示:

val嵌套=df
.选择(分解($“data.InterfaceEntity”).别名(“l1”))
.选择(分解($“l1.L1F”).别名(“l2”))
.select($“l2.rmonIfIn.attributes”。别名(“l3”))
。选择($“l3.broadcastPkts”、$“l3.discards”、$“l3.errors”、$“l3.multicastPkts”、$“l3.packetRate”)
返回一个看起来像

+-------------+--------+------+-------------+----------+
|broadcastPkts|discards|errors|multicastPkts|packetRate|
+-------------+--------+------+-------------+----------+
|1            |1       |1     |1            |1         |
|2            |2       |2     |2            |2         |
|3            |3       |3     |3            |3         |
|4            |4       |4     |4            |4         |
+-------------+--------+------+-------------+----------+

您应该发布一个或至少一个完整的架构。有没有方法附加文档?没有,您必须使用代码块。@user3521305是我的帮助答案?如果没有,请提供一些反馈
Gson gson = new Gson();
Type type = new TypeToken()<ArrayList<Map<>>>{}.getType();
ArrayList<Map<>> = gson.fromJson(listOfMapsInJsonFormat, type);
+-------------+--------+------+-------------+----------+
|broadcastPkts|discards|errors|multicastPkts|packetRate|
+-------------+--------+------+-------------+----------+
|1            |1       |1     |1            |1         |
|2            |2       |2     |2            |2         |
|3            |3       |3     |3            |3         |
|4            |4       |4     |4            |4         |
+-------------+--------+------+-------------+----------+