未在加载时强制执行Spark Scala模式

时间:2019-01-30 03:55:30

标签: java scala apache-spark apache-spark-sql

我正在火花壳上尝试一个Spark scala示例,如下所示;

val myManualSchema = StructType(Array(StructField("DEST_COUNTRY_NAME", StringType, true), 
StructField("ORIGIN_COUNTRY_NAME",StringType
, true), StructField("count", LongType, nullable=false)))

val dfNew = spark.read.format("json").schema(myManualSchema).load("/test.json")

dfNew.printSchema()

我得到的输出如下;

root
|-- DEST_COUNTRY_NAME: string (nullable = true)
|-- ORIGIN_COUNTRY_NAME: string (nullable = true)
|-- count: long (nullable = true)

我期望count列为nullable=false,但似乎并没有执行。但是,当我从该框架创建一个新的DataFrame并在那里设置架构时,它就可以工作。这就是我所做的;

val dfSchemaTest = spark.createDataFrame(dfNew.rdd,myManualSchema)

scala> dfSchemaTest.printSchema()
root
 |-- DEST_COUNTRY_NAME: string (nullable = true)
 |-- ORIGIN_COUNTRY_NAME: string (nullable = true)
 |-- count: long (nullable = false)

如果有人可以在以下情况中指出我的错误,以便在加载数据文件时不执行该模式,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

由于文件格式强制可空性,因此无能为力。这正是spark的作用-如果数据源无法确保该列不为null,则DataFrame在读取时也不能。