Spark结构化流式JSON拼合(不可能爆炸+旋转)

时间:2019-06-17 07:33:14

标签: json apache-spark apache-kafka spark-structured-streaming

我有一个结构化的流作业,该作业从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      |

结构化流媒体怎么可能这样? 通过显式选择它们来获得几个通道而不是全部通道也就足够了。 (例如,只有温度,没有湿度)

0 个答案:

没有答案
相关问题