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

Spark:在不更改列的nullable属性的情况下强制转换十进制

朱梓
2023-03-14

共有1个答案

梁锋
2023-03-14

谢谢你的一个有趣的观点。为了理解这种行为,我对源代码进行了一点研究,答案是在表示强制转换表达式的cast.scala中。公开无效性的属性是这样计算的:

override def nullable: Boolean = Cast.forceNullable(child.dataType, dataType) || child.nullable

  def forceNullable(from: DataType, to: DataType): Boolean = (from, to) match {
  case (NullType, _) => true
  case (_, _) if from == to => false

  case (StringType, BinaryType) => false
  case (StringType, _) => true
  case (_, StringType) => false

  case (FloatType | DoubleType, TimestampType) => true
  case (TimestampType, DateType) => false
  case (_, DateType) => true
  case (DateType, TimestampType) => false
  case (DateType, _) => true
  case (_, CalendarIntervalType) => true

  case (_, _: DecimalType) => true  // overflow
  case (_: FractionalType, _: IntegralType) => true  // NaN, infinity
  case _ => false
}

如您所见,从任何类型到DecimalType的转换总是返回一个可空类型。我想知道为什么,可能是因为这里表达的溢出风险:

/**
 * Change the precision / scale in a given decimal to those set in `decimalType` (i  f any),
 * returning null if it overflows or modifying `value` in-place and returning it if successful.
 *
 * NOTE: this modifies `value` in-place, so don't call it on external data.
 */
private[this] def changePrecision(value: Decimal, decimalType: DecimalType): Decimal = {
  if (value.changePrecision(decimalType.precision,   decimalType.scale)) value else null
}

ChangePrecision方法检查是否可以修改精度,如果是,返回true,否则返回false。它解释了为什么上述方法可以返回null,以及为什么DecimalType在独立地对源类型进行浇注时默认设置为nullable。

 类似资料:
  • 我必须写一个方法,它有一个Integer类型的参数,并且必须返回一个Character类型的对象。如果给定参数的值可以表示为字符对象,则将其作为字符返回。否则返回null。 我的任务制定得很糟糕,它说:“不安全的转换(例如从int到char)在你的代码中是不允许的”,我想这不是不安全的,但也不允许? 到目前为止我的代码: 我试图通过任何方式修复它,但就是无法提出不使用不安全转换的解决方案,非常感谢

  • 问题内容: 我需要一个解决方案将String转换为字节数组,而无需像这样更改: 输入: 输出: 当我使用 那么回复是 但我希望回复是 问题答案: 您应始终确保序列化和反序列化使用相同的字符集,这会将字符映射到字节序列,反之亦然。默认情况下,String.getBytes()和新的String(bytes)使用默认字符集,该字符集可能是特定于语言环境的。 使用getBytes(Charset)重载

  • 我有一个雇主组合。选择雇主后,表格中会填入特定于雇主的数据: 下面是它绑定到的属性和检查表是否脏的方法。如果表是脏的,则提示用户如果他们改变雇主,改变将丢失: 一切似乎都正常工作: 用户选择更新表的雇主('KMH')。 用户对表进行更改。 用户然后选择不同的雇主('MPC') 提示用户更改将丢失 用户选择“否”并且Can火雇主返回“假” 选择雇主不改变(跳过if{}块) 然而,在GUI中,雇主选项

  • 我有一个opencv的mat有M行和3列,有没有一种方法可以重新排序mat,使第一列和最后一列(即第三列)被切换,而中间的一列保持在不复制数据的位置?

  • 我有一堆CSV文件,它们是作为数据流读取的。对于每个dataframe,我希望更改一些列名,如果某个dataframe中存在特定列: column_name_update_map={'aa':'xx';'bb':'yy'}