使用Spark结构化流传输流OpenSkyData

时间:2019-10-06 09:54:00

标签: java json multidimensional-array streaming spark-streaming

我正在尝试从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)

0 个答案:

没有答案