【问题标题】:Is there any way to rewrite the below code using Scala value class or other concept?有什么方法可以使用 Scala 值类或其他概念重写以下代码吗?
【发布时间】:2023-02-14 17:29:21
【问题描述】:

我需要编写两个函数来获取文件转换的输出格式和输出索引。作为其中的一部分,我为这些方法编写了一个 TransformSettings 类并设置了默认值。在转换器类中,我创建了一个新的 TransformSettings 类对象来获取每个作业运行的默认值。此外,我还有另一个名为 ParquetTransformer 的类,它扩展了我想更改这些默认值的 Transformer。所以我像下面这样实现。

class TransformSettings{
  def getOuputFormat: String = {
   "orc"
  }
  def getOuputIndex(table: AWSGlueDDL.Table): Option[String] = {
   table.StorageDescriptor.SerdeInfo.Parameters.get("orc.column.index.access")
  }
}

class Transformer{
 def getTransformSettings: TransformSettings = {
   new TransformSettings
 }

 def posttransform(table: AWSGlueDDL.Table):Dateframe ={
  val indexAccess = getTransformSettings.getOuputIndex(table: AWSGlueDDL.Table)
  ........
 }
}

class ParquetTransformer extends Transformer{
  override def getTransformSettings: TransformSettings = {
   val transformSettings = new TransformSettings {
   
   override def getOuputFormat: String = {
    "parquet"
   }

   override def getOuputIndex(table: AWSGlueDDL.Table): Option[String] = {
    table.StorageDescriptor.SerdeInfo.Parameters.get("parquet.column.index.access")
   }

   }
  }
}

有没有办法避免每次调用时都在 Transformer 类中创建一个全新的 Transform Settings 对象?

还有一种方法可以使用 Scala 值类以有效的方式重写代码吗?

【问题讨论】:

  • 让它成为ParquetTransformer中的val会员?

标签: scala parquet traits orc value-class


【解决方案1】:

正如 @Dima 在 cmets 中提出的那样,尝试在类 Transformer 中使 TransformSettings 成为字段/构造函数参数(val)并在外部实例化它们

class TransformSettings{
  def getOuputFormat: String = {
    "orc"
  }
  def getOuputIndex(table: AWSGlueDDL.Table): Option[String] = {
    table.StorageDescriptor.SerdeInfo.Parameters.get("orc.column.index.access")
  }
}

class Transformer(val transformSettings: TransformSettings) {
  def posttransform(table: AWSGlueDDL.Table): DataFrame ={
    val indexAccess = transformSettings.getOuputIndex(table: AWSGlueDDL.Table)
    ???
  }
}

val parquetTransformSettings = new TransformSettings {
  override def getOuputFormat: String = {
    "parquet"
  }

  override def getOuputIndex(table: AWSGlueDDL.Table): Option[String] = {
    table.StorageDescriptor.SerdeInfo.Parameters.get("parquet.column.index.access")
  }
}

class ParquetTransformer extends Transformer(parquetTransformSettings)

您现在似乎不需要value classes (... extends AnyVal)。他们更多的是拆箱,而不是生命周期管理。 TransformSettingsTransformer 不能是值类,因为它们不是最终的。顺便说一下,值类有很多限制

https://failex.blogspot.com/2017/04/the-high-cost-of-anyval-subclasses.html

https://github.com/scala/bug/issues/12271

除了值类之外,Scala 2 中还有scala-newtype 库,Scala 3 中还有opaque types

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多