我有一个结构化的流作业,该作业从kafka队列中获取json消息并将其存储到parquet / hdfs中。从那里获取消息并按计划进行分析,然后将其存储到mysql数据库中。
现在,我想实现流式传输,在这里我将从kafka中获取json消息进行分析并将其存储到mysql中。
我现在的问题是,Spark结构化流媒体无法提供使用数据透视的可能性。
我的代码现在看起来像这样:
val df = readFromHdfsParquet
val df_exploded= df.select($"device", $"owner", $"timestamp", explode($"channels").as("exploded")
.withColumn("channelName", $"exploded.channelName")
.withColumn($"value", $"exploded.value")
.drop("exploded")
val df_grouped = df_exploded
.groupBy($"device, $"owner", $"timestamp")
.pivot("channelName")
.agg(first($"value", false)
这将导致所需的输出结构包含所有可用通道。
我的Json看起来像这样:
{
"device": "TypeA",
"owner": "me",
"timestamp": "2019-05-12 17:27:59",
"channels": [
{
"channelName": "temperature",
"state": 0,
"value": "27"
},
{
"channelName": "humidity",
"state": 0,
"value": "10"
}
]
}
channels数组的长度未设置,可以随设备而变化。
我想要的是一个具有以下结构的数据框,并将其存储到mysql中。
|device|owner|timestamp |temperature|humidity|
|TypeA |me |2019-05-12 17:27:59|27 |10 |
结构化流媒体怎么可能这样? 通过显式选择它们来获得几个通道而不是全部通道也就足够了。 (例如,只有温度,没有湿度)