Scala 使用Spark结构化流处理包含嵌套实体的JSON

Scala 使用Spark结构化流处理包含嵌套实体的JSON,scala,apache-spark,apache-kafka,nested,spark-structured-streaming,Scala,Apache Spark,Apache Kafka,Nested,Spark Structured Streaming,我想使用Spark结构化流媒体从Kafka主题源读取嵌套数据。 我的Scala代码(案例类和Spark处理代码): 当我向卡夫卡发送数据时: {"a_str":"Str","a_long":100,"a_nested":[{"attr_int":0,"attr_string":"nested_0","attr_float":0.0,"attr_timestamp":"2018-01-01T11:00:00.123321+02:00"},{"attr_int":1,"attr_string":"n

我想使用Spark结构化流媒体从Kafka主题源读取嵌套数据。 我的Scala代码(案例类和Spark处理代码):

当我向卡夫卡发送数据时:

{"a_str":"Str","a_long":100,"a_nested":[{"attr_int":0,"attr_string":"nested_0","attr_float":0.0,"attr_timestamp":"2018-01-01T11:00:00.123321+02:00"},{"attr_int":1,"attr_string":"nested_1","attr_float":1.0,"attr_timestamp":"2018-02-02T12:01:01.023321+02:00"}]}
我得到的结果是:

+--------+-----------+----------+--------------------+
|attr_int|attr_string|attr_float|      attr_timestamp|
+--------+-----------+----------+--------------------+
|       0|   nested_0|       0.0|2018-01-01 13:02:...|
|       1|   nested_1|       1.0|2018-02-02 14:01:...|
+--------+-----------+----------+--------------------+
现在,我想将每个嵌套项连接到父数据,例如:

+--------+-----------+----------+--------------------+-------+--------+
|attr_int|attr_string|attr_float|      attr_timestamp| a_str | a_long |
+--------+-----------+----------+--------------------+-------+--------+
|       0|   nested_0|       0.0|2018-01-01 13:02:...|   Str |    100 |
|       1|   nested_1|       1.0|2018-02-02 14:01:...|   Str |    100 |
+--------+-----------+----------+--------------------+-------+--------+
请注意,
“a_str”
“a_long”
是父实体
“parent”
中的列。 由于我不是Spark结构化流处理专家,我想知道最“惯用”的方法是什么? 目前我有以下假设:

  • 创建自定义Kafka值反序列化器
  • 在结构化流上编写某种类型的连接(我坚持这样做),但我认为这需要更改json结构(例如,在嵌套的一些键值中指定) 指向父对象(数据)
  • 编写自定义方法,该方法将返回连接实体的非规范化数据,并将
    flatMap
    与此方法一起使用
  • 请告知

    谢谢


    更新1:为了您的方便,我在GitHub上创建了相应的项目:

    感谢Glennie Helles Sindholt和其他Google用户:

    .select($"nested.*", $"a_str", $"a_long")
    

    Github存储库也进行了更新。

    这是因为您正在专门编写
    。选择(“nested.*”)。作为[nested]
    ,它将只返回
    nested
    -列。如果你忽略了这一点,我相信你会得到
    a_str
    a_long
    列映射到你想要的行:)(另请参见此答案:)@Glenniehellesindholt谢谢你的回复。不幸的是,如果我省略
    .as[Nested]
    语句,我将得到
    a_Nested
    列,其中包含复杂的结构,我希望将此列的所有数据作为一个单独的列来获取。实际上,如果我仅省略
    as[Nested]
    语句,我将在单独的列中得到嵌套的实体,但父实体列将丢失。如果我省略
    select(“nested.*”)。作为[nested]
    语句,我会得到父实体列和嵌套的实体一列,这些列中包含复杂的数据。啊,对不起-您想写
    。选择($“nested.*”、$“a_str”、$“a_long”)
    :)
    .select($"nested.*", $"a_str", $"a_long")