Spark Streaming RDD嵌套JSON Schema配置及取值问题求助
解决Spark处理嵌套JSON时
interface-name返回数组的问题 嘿,我来帮你搞定这个问题!你现在拿到数组形式的结果,核心原因是**Rows字段定义成了ArrayType**,直接查询时Spark会保留数组结构,所以返回的是包含单个元素的数组。咱们只需要把数组展开,就能拿到单个字符串值了。
解决方案步骤
- 使用
explode函数将Rows数组拆分成单独的行(每个数组元素对应一行) - 从展开后的行中提取
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
相关产品推荐
相关产品推荐

