当前位置: 首页 > 知识库问答 >
问题:

从具有正确可空性的case类中激发模式

冯通
2023-03-14

对于自定义估计器的transformSchema方法,我需要能够将输入数据帧的模式与案例类中定义的模式进行比较。通常,这可以像从案例类生成Spark结构类型/模式一样执行,如下所述。但是,使用了错误的可空性:

由spark推断出的df的真实模式。阅读csv()。正如[MyClass]所示:

root
 |-- CUSTOMER_ID: integer (nullable = false)

和案例类:

case class MySchema(CUSTOMER_ID: Int)

要进行比较,我使用:

val rawSchema = ScalaReflection.schemaFor[MySchema].dataType.asInstanceOf[StructType]
  if (!rawSchema.equals(rawDf.schema))

不幸的是,这总是会产生false,因为从case类手动推断的新模式正在将nullable设置为true(因为ja java。整数实际上可能为空)

root
 |-- CUSTOMER_ID: integer (nullable = true)

创建架构时如何指定nullable=false

共有1个答案

景品
2023-03-14

可以说,你是在混合不属于同一个空间的东西。ML管道本质上是动态的,引入静态类型的对象并不能真正改变这一点。

此外,类的架构定义为:

case class MySchema(CUSTOMER_ID: Int)

将具有不可为空的CUSTOMER_IDscala。Intjava.lang.intger不同:

scala> import org.apache.spark.sql.catalyst.ScalaReflection.schemaFor
import org.apache.spark.sql.catalyst.ScalaReflection.schemaFor

scala> case class MySchema(CUSTOMER_ID: Int)
defined class MySchema

scala> schemaFor[MySchema].dataType
res0: org.apache.spark.sql.types.DataType = StructType(StructField(CUSTOMER_ID,IntegerType,false))

也就是说,如果您希望字段可以为null,那么:

case class MySchema(CUSTOMER_ID: Option[Int])

如果您不想为空,请使用Int如上。

这里的另一个问题是,对于csv,根据定义,每个字段都可以为空,并且该状态由编码的数据集“继承”。因此,在实践中:

spark.read.csv(...)

将始终导致:

root
 |-- CUSTOMER_ID: integer (nullable = true)

这就是模式不匹配的原因。不幸的是,对于不强制可空性约束的源,如csv或json,无法重写可空字段。

如果具有不可为空的模式是硬性要求,您可以尝试:

spark.createDataFrame(
  spark.read.csv(...).rdd,
  schemaFor[MySchema].dataType.asInstanceOf[StructType]
).as[MySchema]

只有当您知道数据实际上null免费时,这种方法才有效。任何null值都会导致运行时异常。

 类似资料:
  • 读取CSV文件。 基于记录子集(10-100行?),迭代地检查每行的每列,以自动确定CSV中数据的正确列类型。因此,如果第1行A列的值为12345(int),但第2行A列的值为ABC(varchar),系统将根据在前两次传递中找到的数据的组合自动确定它应该是varchar(5)格式。只要用户认为有必要确定列的可能类型和大小,这个过程就可以进行多少次。 按照CSV的列检查定义构建CREATE TAB

  • 如文件中所述: “拥有REQUEST_IGNORE_BATTERY_OPTIMIZATIONS权限的应用程序可以触发一个系统对话框,让用户直接将应用程序添加到白名单中,而不需要进入设置。应用程序会触发一个ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS来触发对话框。”

  • 对于将SFINAE与可变模板类一起使用,我似乎找不到一个好的解决方案。 假设我有一个不喜欢引用的可变参数模板对象: 以及一个类,可以方便地检查参数包是否包含引用: 我如何使用它来专门化NoRef的情况下,引用存在于arg包?

  • 抱歉,如果我问的是新手问题,但名称空间对我来说真的很费解。 我试图从一个XML/XSLT生成多个SVG文档。 我的样式表: 这样做会产生以下输出: 但我希望能够根据计算的内容指定高度和宽度属性 我尝试将“ ”创建为 http://www.w3.org/2000/svg 这将失败,因为它(xmlspy)不允许我分配xmlns属性。 如果不在根(svg)上指定名称空间,则xmlns将自动添加到根 节点

  • 我有一个Maven项目,包含三个模块:、和。模式包含两个XSD:-一个简单的GML配置文件和使用相对模式位置导入GML模式,如下所示: 在模块和模块中,我使用和来生成带有equals()和hashCode()的类。模块工作正常,但在运行时,我遇到以下错误: 好的一份目录文件来拯救我们! 看起来绝对路径已解决,但随后出现了畸形的异常。 这是我的的pom: 我尝试过一些解决方案: 将Maven URL

  • 问题内容: 我决定为我的一个项目切换到svg符号-但需要它们做出 响应 。主要思想是不要有多个http请求,因此我考虑将所有SVG合并到一个SVG中,定义符号并按如下方式使用它们: 这是一个jsfiddle,请检查IE中的其他行为(我检查了11,但读到9也有多个问题): http //jsfiddle.net/ws472q71/ 为了我的一生,我无法正常工作。上面的代码在Firefox和Chrom