You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark Streaming RDD嵌套JSON Schema配置及取值问题求助

解决Spark处理嵌套JSON时interface-name返回数组的问题

嘿,我来帮你搞定这个问题!你现在拿到数组形式的结果,核心原因是**Rows字段定义成了ArrayType**,直接查询时Spark会保留数组结构,所以返回的是包含单个元素的数组。咱们只需要把数组展开,就能拿到单个字符串值了。

解决方案步骤

  1. 使用explode函数将Rows数组拆分成单独的行(每个数组元素对应一行)
  2. 从展开后的行中提取interface-name字段(注意字段名带横杠,要用反引号包裹避免语法错误)

修改后的代码

import org.apache.spark.sql.functions.explode

stream.foreachRDD { (rdd, time) => 
  val data = rdd.map(record => record.value) 
  val jsonData = spark.read.schema(schema_array).json(data) 
  
  // 关键修改:先展开Rows数组,再提取字段
  val result = jsonData
    .select(explode($"Rows").alias("row")) // 展开数组,给每个元素起别名row
    .select($"row.Keys.`interface-name`") // 用反引号包裹带横杠的字段名
  
  result.show() 
}

为什么这样能解决?

  • explode($"Rows")会把原来的数组列Rows中的每个元素都拆成独立的行,原来的数组结构消失,变成一条条单独的记录
  • 字段名interface-name包含减号,Spark会默认把它解析成表达式(比如interface - name),所以必须用反引号``把整个字段名括起来,告诉Spark这是一个完整的字段名

验证结果

修改后执行result.show(),就能得到你想要的单个字符串结果:

+----------------+
| interface-name|
+----------------+
| Bundle-Ether56 |
+----------------+

如果你的Rows数组里有多个元素,explode会把每个元素都拆成一行,这样每条接口数据都会单独展示,这也符合Telemetry数据的常见场景~

内容的提问来源于stack exchange,提问作者fast-ta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:26:21