Java 数据集从csv文件加载,模式要求字段不可为空。然后,printSchema()描述了可为null的字段

Java 数据集从csv文件加载,模式要求字段不可为空。然后,printSchema()描述了可为null的字段,java,apache-spark,Java,Apache Spark,我用apachespark加载了一个csv文件 Dataset csv=session.read().schema(schema()).format(“csv”) .option(“header”、“true”)。option(“delimiter”、“delimiter”)。load(“myFile.csv”)。selectExpr(“*”); 为此,我提供了一个模式: 公共结构类型架构(布尔重命名){ StructType架构=新StructType(); schema=schema.ad

我用apachespark
加载了一个csv文件

Dataset csv=session.read().schema(schema()).format(“csv”)
.option(“header”、“true”)。option(“delimiter”、“delimiter”)。load(“myFile.csv”)。selectExpr(“*”);
为此,我提供了一个模式:

公共结构类型架构(布尔重命名){
StructType架构=新StructType();
schema=schema.add(“CODGEO”,StringType,false)
.add(“P16_POP1564”,双重类型,假)
.add(“P16_POP1524”,双重类型,假)
.add(“P16_POP2554”,双重类型,假)
.add(“P16_POP5564”,双重类型,假)
.添加(“P16_H1564”,双重类型,假)
....
返回模式;
}
数据集已加载。控制台上显示了一个
printSchema()

root
 |-- CODGEO: string (nullable = true)
 |-- P16_POP1564: double (nullable = true)
 |-- P16_POP1524: double (nullable = true)
 |-- P16_POP2554: double (nullable = true)
 |-- P16_POP5564: double (nullable = true)
 |-- P16_H1564: double (nullable = true)
 ...
但每个字段都标记为null=true

我明确要求它们中的每一个都不能为null


有什么问题吗?

对我来说,它工作得很好-

默认情况下,读取csv时,空字符串(“”)被视为null

测试-1。具有null的数据集架构null=false
String data=“id列1列2列3列4列5\n”+
“1 A B C D E\n”+
“2 X Y Z P\”;
List List=Arrays.stream(data.split(System.lineSeparator()))
.map(s->s.replaceAll(“\\s+”,“,”))
.collect(Collectors.toList());
列表字段=数组.stream(“id列1列2列3列4列5.split(\\s+”))
.map->new StructField(s,DataTypes.StringType,false,Metadata.empty())
.collect(Collectors.toList());
数据集df1=spark.read()
.schema(新结构类型(fields.toArray(新结构字段[fields.size()]))
.选项(“标题”,真)
.期权(“sep”、“、”)
.csv(spark.createDataset(list,Encoders.STRING());
df1.show();
df1.printSchema();
输出-

java.lang.NullPointerException
位于org.apache.spark.sql.catalyst.expressions.GeneratedClass$SpecificSafeProjection.createExternalRow_0_0$(未知源)
位于org.apache.spark.sql.catalyst.expressions.GeneratedClass$SpecificSafeProjection.apply(未知源)
位于org.apache.spark.sql.Dataset$$anonfun$org$apache$spark$sql$Dataset$$collectFromPlan$1.apply(Dataset.scala:3387)
位于org.apache.spark.sql.Dataset$$anonfun$org$apache$spark$sql$Dataset$$collectFromPlan$1.apply(Dataset.scala:3384)
在scala.collection.TraversableLike$$anonfun$map$1.apply处(TraversableLike.scala:234)
在scala.collection.TraversableLike$$anonfun$map$1.apply处(TraversableLike.scala:234)
结论-预期行为PASS

2.具有null的数据集架构null=true
String data=“id列1列2列3列4列5\n”+
“1 A B C D E\n”+
“2 X Y Z P\”;
List List=Arrays.stream(data.split(System.lineSeparator()))
.map(s->s.replaceAll(“\\s+”,“,”))
.collect(Collectors.toList());
列表字段=数组.stream(“id列1列2列3列4列5.split(\\s+”))
.map->new StructField(s,DataTypes.StringType,true,Metadata.empty())
.collect(Collectors.toList());
数据集df1=spark.read()
.schema(新结构类型(fields.toArray(新结构字段[fields.size()]))
.选项(“标题”,真)
.期权(“sep”、“、”)
.csv(spark.createDataset(list,Encoders.STRING());
df1.show();
df1.printSchema();
输出-

+---+-----+-----+-----+-----+-----+
|id | Col|u 1 | Col|u 2 | Col|u 3 | Col|u 4 | Col|u 5|
+---+-----+-----+-----+-----+-----+
|1 | A | B | C | D | E|
|2 | X | Y | Z | P | null|
+---+-----+-----+-----+-----+-----+
根
|--id:string(nullable=true)
|--Col_1:string(nullable=true)
|--Col_2:string(nullable=true)
|--Col_3:字符串(nullable=true)
|--Col_4:字符串(nullable=true)
|--第5列:字符串(nullable=true)
结论-预期行为PASS

3.不带null的数据集&Schema nullable=true
String data1=“id列1列2列3列4列5\n”+
“1 A B C D E\n”+
“2xyzpf”;
List list1=Arrays.stream(data1.split(System.lineSeparator()))
.map(s->s.replaceAll(“\\s+”,“,”))
.collect(Collectors.toList());
列表字段1=Arrays.stream(“id列1列2列3列4列5.split(\\s+”))
.map->new StructField(s,DataTypes.StringType,true,Metadata.empty())
.collect(Collectors.toList());
数据集df2=spark.read()
.schema(新结构类型(fields1.toArray(新结构字段[fields.size()]))
.选项(“标题”,真)
.期权(“sep”、“、”)
.csv(spark.createDataset(list1,Encoders.STRING());
df2.show();
df2.printSchema();
输出-

+---+-----+-----+-----+-----+-----+
|id | Col|u 1 | Col|u 2 | Col|u 3 | Col|u 4 | Col|u 5|
+---+-----+-----+-----+-----+-----+
|1 | A | B | C | D | E|
|2 | X | Y | Z | P | F|
+---+-----+-----+-----+-----+-----+
根
|--id:string(nullable=true)
|--Col_1:string(nullable=true)
|--Col_2:string(nullable=true)
|--Col_3:字符串(nullable=true)
|--Col_4:字符串(nullable=true)
|--第5列:字符串(nullable=true)

结论-预期行为PASS

我期待一个
printSchema()
回复我:
id:string(nullable=false)
它的测试用例1,因为数据为null,所以它失败了。你可以有4个