Apache spark 使用.as[A]强制架构不会';不要强制执行该类型

Apache spark 使用.as[A]强制架构不会';不要强制执行该类型,apache-spark,apache-spark-dataset,Apache Spark,Apache Spark Dataset,我试图在SQLServer中读取一个表,然后我想强制执行我所读取的内容的模式。所以我定义: case class WhatIWant(FieldA:String,FieldB:String) 然后,我尝试从SQL server执行常规spark读取,我读取的数据帧类型为: input:org.apache.spark.sql.DataFrame FieldA:integer FieldB:String 然后,当我阅读时,我将附加为[WhatIWant],我认为这将使它成为一个数

我试图在SQLServer中读取一个表,然后我想强制执行我所读取的内容的模式。所以我定义:

case class WhatIWant(FieldA:String,FieldB:String)

然后,我尝试从SQL server执行常规spark读取,我读取的数据帧类型为:

input:org.apache.spark.sql.DataFrame
    FieldA:integer
    FieldB:String
然后,当我阅读时,我将
附加为[WhatIWant]
,我认为这将使它成为一个
数据集[WhatIWant]
,具有我定义的键入信息。事实证明,在笔记本中,它实际上会给我:

intput:org.apache.spark.sql.Dataset[WhatIWant]
    FieldA:integer
    FieldB:String
现在我对两件事感到困惑:

  • 如果在Dataframe中推断出的模式与case类的定义不同,那么
    .as[]
    是否会实际执行该模式
  • 我假设数据集是强类型的。但是我从Databricks笔记本上得到的打字信息实际上与我定义的不一样。对此有何解释
  • 简要说明:
    “FieldA”的所有值都是null,我觉得这是其中的一部分,但我仍然感到困惑。

    从关系存储中读取遵循所需表的DDL中定义的模式。如果需要,可以将查询参数传递给SparkConf,并将SQL Server查询作为其值,Spark将在数据库上运行查询以获取结果。方法为[]只有在为Case类创建CustomEncoder并使其在运行命令将数据从SQL Server读取到DataFrameReading的文件中隐式可用时才会生效从关系存储读取遵循所需表的DDL中定义的模式。如果需要,可以将查询参数传递给SparkConf,并将SQL Server查询作为其值,Spark将在数据库上运行查询以获取结果。方法为[]只有在为Case类创建CustomEncoder并使其在运行命令的文件中隐式可用以将SQL Server中的数据读取到数据帧中时,此命令才会生效