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

如何用Java Spark提取JSON嵌套数组的指定元素?

Java Spark 获取嵌套数组指定元素的解决方案

目标JSON内容

{"Id": 11,"data": [{"package": "com.browser1","activetime": 60000,"steps": [{"x":  1, "y":  2},{"x": 11, "y": 12}]},{"package": "com.browser6","activetime": 1205000,"steps": [{"x":  3, "y":  4}]},{"package": "com.browser7","activetime": 1205000,"steps": [{"x":  5, "y":  6}]}]}

问题说明

直接用df.select(json.data[0].steps[1].x)这种语法无法成功获取嵌套数组元素,因为Spark的Column操作需要通过getItem方法访问数组索引,而非直接使用方括号语法。

解决方案代码

方法1:链式调用getItem与getField

import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
import static org.apache.spark.sql.functions.col;

public class SparkNestedJsonReader {
    public static void main(String[] args) {
        SparkSession spark = SparkSession.builder()
                .appName("NestedJsonReader")
                .master("local[*]")
                .getOrCreate();

        // 读取JSON文件
        Dataset<Row> df = spark.read().json("path/to/your/target.json");

        // 获取data[0].steps[0].x和data[0].steps[1].x
        Dataset<Row> result = df.select(
                col("data").getItem(0).getField("steps").getItem(0).getField("x").alias("first_step_x"),
                col("data").getItem(0).getField("steps").getItem(1).getField("x").alias("second_step_x")
        );

        // 打印结果
        result.show();

        spark.stop();
    }
}

方法2:使用expr表达式(SQL风格路径)

import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
import static org.apache.spark.sql.functions.expr;

public class SparkNestedJsonReader {
    public static void main(String[] args) {
        SparkSession spark = SparkSession.builder()
                .appName("NestedJsonReader")
                .master("local[*]")
                .getOrCreate();

        Dataset<Row> df = spark.read().json("path/to/your/target.json");

        // 直接用SQL风格的路径表达式获取元素
        Dataset<Row> result = df.select(
                expr("data[0].steps[0].x").alias("first_step_x"),
                expr("data[0].steps[1].x").alias("second_step_x")
        );

        result.show();

        spark.stop();
    }
}

代码说明

  • getItem(index):专门用于访问数组类型字段的指定索引元素,数组索引从0开始
  • getField(fieldName):用于访问结构体类型的指定字段
  • expr(sqlExpression):允许直接使用SQL风格的嵌套路径写法,代码更简洁直观

内容的提问来源于stack exchange,提问作者Dhana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 14:45:48