Java 选择JSON Spark JSON数据集中不存在的字段

Java 选择JSON Spark JSON数据集中不存在的字段,java,json,apache-spark,dataset,apache-spark-sql,Java,Json,Apache Spark,Dataset,Apache Spark Sql,我使用的是Java Spark,JSON如下所示: { "name": "myname", "age":"35" } 或: 我读到的数据集如下: Dataset<Row> df = sparkSession.read().json(jsonSet); Dataset<Row> dfSelect = df.select(cols);//Where cols is Column[] List<StructField> fields =

我使用的是Java Spark,JSON如下所示:

{
      "name": "myname",
       "age":"35"
}
或:

我读到的
数据集
如下:

Dataset<Row> df = sparkSession.read().json(jsonSet);
Dataset<Row> dfSelect = df.select(cols);//Where cols is Column[]
List<StructField> fields = new ArrayList<>();
fields.add(DataTypes.createStructField("name", DataTypes.StringType, true));
fields.add(DataTypes.createStructField("age", DataTypes.StringType, true));
fields.add(DataTypes.createStructField("country", DataTypes.StringType, true));
StructType schema = DataTypes.createStructType(fields);

Dataset<Row> df = sparkSession.read().schema(schema).json(jsonSet);
Dataset df=sparkSession.read().json(jsonSet);
数据集dfSelect=df.select(cols)//其中cols是列[]
数组
cols
包含列
name
age
country
,但有时JSON不包含
country
字段和
df。select(cols)
抛出异常


即使JSON文件中不存在字段,如何选择所有字段?

正如philantrovert在评论中所建议的,在读取JSON文件时,可以使用预定义的模式。如果json文件中不存在该列,则所有值都将为
null
。它可以用Java实现,如下所示:

Dataset<Row> df = sparkSession.read().json(jsonSet);
Dataset<Row> dfSelect = df.select(cols);//Where cols is Column[]
List<StructField> fields = new ArrayList<>();
fields.add(DataTypes.createStructField("name", DataTypes.StringType, true));
fields.add(DataTypes.createStructField("age", DataTypes.StringType, true));
fields.add(DataTypes.createStructField("country", DataTypes.StringType, true));
StructType schema = DataTypes.createStructType(fields);

Dataset<Row> df = sparkSession.read().schema(schema).json(jsonSet);
List fields=new ArrayList();
add(DataTypes.createStructField(“name”,DataTypes.StringType,true));
add(DataTypes.createStructField(“age”,DataTypes.StringType,true));
add(DataTypes.createStructField(“country”,DataTypes.StringType,true));
StructType schema=DataTypes.createStructType(字段);
Dataset df=sparkSession.read().schema(schema).json(js起立);

可以根据需要在架构中更改列数据类型。由于
df
已经包含所需的列,因此无需在之后对列执行
select

您可以在读取json时尝试定义静态架构。@YaKo:对于嵌套列,您仍然必须使用
select
withColumn
来展平数据帧架构。在这种情况下应该如何创建模式的示例可以在这里看到,例如:在我创建模式之后,当我创建select(cols)时,它仍然抛出异常,因为它找不到column@YaKo:如果您有一个嵌套的JSON(如您的注释所示),则在阅读时需要提供一个嵌套的模式。您能否在选择之前尝试使用
printSchema()
,以检查所有列是否都存在?@Shido,谢谢@亚科:没问题,很乐意帮忙:)