我正在尝试从https://opensky-network.org/apidoc/rest.html#all-state-vectors中描述的API流数据。但是,响应只是一个JSON文件,其中包含一个时间戳和一个矩阵,其中每一行都是带有飞行数据(例如航班号,飞机位置等)的向量。
JSON如下:
{"time":1570277165,"states":[[Data for flight1],[Data for flight2],...[Data for flightN]]}
例如[flight1的数据]如下所示:
["ab1644","UAL400 ","United States",1570277164,1570277165,-89.5318,40.6011,8770.62,false,242.02,41.38,-10.4,null,9197.34,"1370",false,0]
现在的问题是如何使用Java中的Spark结构化流对其进行流处理。到目前为止,这是我的方法:
SparkSession session = SparkSession.builder().appName("Spark_Streaming").master("local[2]").getOrCreate();
StructType schema = new StructType()
.add("time", DataTypes.StringType)
.add("states",
DataTypes.createArrayType(DataTypes.createArrayType(DataTypes.StringType)));
Dataset<Row> rawData = session.readStream().option("maxFilesPerTrigger",1).format("json").schema(schema).json("/Users/localuser/Documents/flight/data/*");
rawData.writeStream().format("console").start().awaitTermination();
效果很好,可以给我
-------------------------------------------
+----------+--------------------+
| time| states|
+----------+--------------------+
|1570277165|[[ab1644, UAL400 ...|
+----------+--------------------+
但是问题在于,它对应于以下结构:
root
|-- states: array (nullable = true)
| |-- element: array (containsNull = true)
| | |-- element: string (containsNull = true)
|-- time: long (nullable = true)
在这里,我有一个字符串数组,包裹在状态元素中。但是,spark允许通过使用数据的架构来流数据。为此,我创建了以下架构
StructType statesData = new StructType()
.add("icao24", DataTypes.StringType)
.add("callsign", DataTypes.StringType)
.add("origin_country", DataTypes.StringType)
.add("time_position", DataTypes.StringType)
.add("last_contact", DataTypes.StringType)
.add("longitude", DataTypes.StringType)
.add("latitude", DataTypes.StringType)
.add("baro_altitude", DataTypes.StringType)
.add("on_ground", DataTypes.StringType)
.add("velocity", DataTypes.StringType)
.add("true_track", DataTypes.StringType)
.add("vertical_rate", DataTypes.StringType)
.add("sensors", DataTypes.createArrayType(DataTypes.IntegerType))
.add("geo_altitude", DataTypes.StringType)
.add("squawk", DataTypes.StringType)
.add("spi", DataTypes.StringType)
.add("position_source",DataTypes.StringType);
StructType schema = new StructType()
.add("time", DataTypes.StringType)
.add("states", DataTypes.createArrayType(statesData));
但是,如果我使用此架构,则spark找不到文件
+----+------+
|time|states|
+----+------+
|null| null|
|null| null|
+----+------+
现在我问自己是否有使用模式或对其进行调整的替代方法,或者是否有可能将输入数组展平,以便以可以与相应标签合并的方式使用该展平结构从模式开始,但是我现在真的不知道。
因此,我非常期待您的建议。
问候 布格(J.Bug)