如何用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
相关产品推荐
相关产品推荐

