我想将一些文件整合到一个数据库表中。文件具有相似但不同的格式。文件看起来像这样:
FileOne:
FileTwo传送:
FileThree:
目标表如下所示:
TableDestination:
我想开发一个映射,将这三个文件ETL到这个数据库中,但由于列名不同,看起来我必须开发三种不同的映射,或三种不同的源,或三种不同的出头。问题是我的例子是人为的:我实际上有许多不同的文件都有不同的格式和列名,但数据都非常相似。
我想开发一个单一的映射或工作流,只需添加一个包含列映射的表即可处理所有这些。根据上面的示例文件和示例表,这样的表看起来像这样:
使用TableMappings:
通过这种方式,要编辑列映射,我只需要对此TableMappings表进行编辑。我不必对映射或工作流程进行任何更改。我也不必重新部署申请。
地图或工作流程看起来会是什么样才能利用这样的东西?我假设它是一个平面文件源,从文件夹中获取文件。中间会有一些东西使用这个TableMappings表来映射列名。最后会有一个关系数据对象代表我的目标数据库表" TableDestination"。我不知道怎么把它放在一起。
答案 0 :(得分:1)
以Flat Files
作为来源,列名称并不重要。如果列数匹配则无关紧要。如果实际文件将包含更多列Source Definition
,则只会读取前n列(n为Source Definition
中的端口数)。在相反的情况下,额外的端口将包含空值。
话虽如此,加载多个平面文件很容易。
问题是如果列顺序不同并且您希望这个额外的静态表定义列映射。这是可行的,即Java Transformation
可用于进行列映射。但是整个解决方案对我来说太复杂了。我可以尝试回答一些精确的,具体的问题 - 但我无法准备和粘贴完整的解决方案。
答案 1 :(得分:0)
这也可以使用表达式完成。您需要一个“通用”Source Definition
(例如Column1
,Column2
,...,ColumnN
),并在每个端口中都有一个表达式,用于检查应返回哪个端口。 E.g。
DECODE (SUBSTR(TargetColumnOrder,X,1),
'1', Column1,
'2', Column2,
...
'N', ColumnN)
以X为端口索引。
以上假设映射表的结构有点不同:
FileName | TargetColumnOrder
----------------------------
FileOne | 231
FileTwo | 527
注1:如果列数不同,则需要检查Length(TargetColumnOrder)
是否不小于端口索引,否则SUBSTRING将无效。
注2:上述解决方案尚未经过测试甚至未实施。请将此视为一般性描述,而不是确切的代码库。