Scala 使用Spark结构化流处理包含嵌套实体的JSON
我想使用Spark结构化流媒体从Kafka主题源读取嵌套数据。 我的Scala代码(案例类和Spark处理代码): 当我向卡夫卡发送数据时: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
{"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结构化流处理专家,我想知道最“惯用”的方法是什么?
目前我有以下假设:
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")