尽可能动态地导入数据

时间:2013-10-14 21:35:09

标签: scala etl

我正在寻找一些迷你图案: 该程序应该能够支持各种格式作为输入,然后应用转换,并在最后一步将它们加载到数据库中。

其主要目的是提供测试数据。

我最初的想法是将不同的组件粘合在一起,如下所示:

我们有一个从通用数据源[A]中提取到[B]迭代器的提取器 然后是一个映射[B]到[C]的转换器,最后是一个将[C]加载到数据库中的步骤。我敢肯定必须有更好的方法来解决这个问题。是否有更好的,可能更通用的方法来实现这一目标?

trait Importer[A, B, C] {

  val extractor: Extractor[A, B]
  val transformer: Transformator[B, C]
  val loader: Loader[C]

  /**
   * this is the method call for chaining all events together
   */
  def importAndTransformData(dataSource: A): Unit =
    {
     /**
      * extraction step
      */
      val output = extractor.extract(dataSource: A)

      /**
       * conversion method
       */
      val transformed = output map (transformer.transform(_))

      /**
       * loading step
       */
      transformed.foreach(loader.load(_))
    }

}

致以最诚挚的问候,

的Stefan

1 个答案:

答案 0 :(得分:0)

Scala中使用的一种常见方法是自我键入(特别是在Cake Pattern中使用)。在你的情况下,看起来像:

trait Importer[A, B, C] {
  self: Extractor[A, B] with Transformator[B, C] with Loader[C] =>

  /**
   * this is the method call for chaining all events together
   */
  def importAndTransformData(dataSource: A): Unit =
    {
     /**
      * extraction step
      */
      val output = extract(dataSource: A)

      /**
       * conversion method
       */
      val transformed = output map (transform(_))

      /**
       * loading step
       */
      transformed.foreach(load(_))
    }

}

然后,您可以使用以下代码构建导入程序:

val importer = new Importer with FooExtractor with FooBarTransformer with BarLoader {}

val testImporter = Importer with MockExtractor with TestTransformer with MockLoader {}

或类似的测试用例。