【问题标题】:Unable to load distinct records via lookup in informatica无法通过 informatica 中的查找加载不同的记录
【发布时间】:2019-11-02 19:27:31
【问题描述】:

这是一件非常奇怪的事情,我不知道为什么。我创建了一个映射,它通过表达式转换数据并根据对同一目标的查找将数据加载到目标(文件)中。

Source table

#CompanyName
Acne Lmtd
Acne Ltd
N/A
None 
Abc Ltd
Abc Ltd
X

映射

  Source
->Exp(trim..)
->Lookup(source.company_name
  = tgt.company_name)
   ReturnPort is CompId

  -> filter(ISNULL(CompId)) 
  -> Target 
    Compid (via sequence 
     gen) 
     CompName 

上述映射逻辑插入重复的公司名称,就像在源 2 Abc Ltd 记录中一样,在目标中也重复。我不知道为什么。我也尝试过调试,即使该记录已经插入到目标中,过滤器中的条件评估为 true,companyid 为空。

另外,我认为这可能是查找缓存的情况,我也启用了动态,但结果相同。它应该像 sql 查询一样工作

select company_id
From lkptarget where 
company_name
In (select company_name 
 from 
Source)

因此,对于 Abc Ltd,过滤条件应为 false

  Isnull(company_id) false

但是,这正在成为现实。如何在不使用 distinct 的情况下通过查找获得唯一记录?

注意:使用的查找已经是动态查找

【问题讨论】:

  • 您始终可以使用Aggregator transform 并按您想要使其与众不同的所有数据进行分组。因此,如果您按所有列分组,则只有那些不同的列最终会出现。
  • 嗯,但我不想以任何方式使用 distinct,我想我已经在上面提到过。我在上面所做的是在目标上应用查找记录(如果存在),但在过滤时它显示为空,这意味着记录不存在,即使它确实存在
  • 有什么特别的理由不想用吗?
  • 这是给我的任务。即使我什至不需要聚合器,我也可以在源限定符中使用 distinct,但正如我所说,它的任务是通过查找来实现它
  • 那么您可以使用 group by 子句来删除 distinct。

标签: sql oracle11g informatica informatica-powercenter


【解决方案1】:

这实际上是一个动态缓存问题,newLookupRow 在重复项上被赋值为 0,所以我在过滤器中添加了条件为 ISNULL(COMPANYID) 和 NEWLOOKUPROW=1 最后确实奏效了。

【讨论】:

    【解决方案2】:

    查找转换无法知道映射中的进一步转换会发生什么。它无法在目标本身中看到结果,因为查找缓存在映射开始时使用与数据库的单独连接加载一次。即使您禁用缓存(这意味着每个 Lookup 输入行一个查询),写入目标时数据也不会立即提交(因此对其他连接不可见)。

    这就是使用动态查找缓存的原因,它通过向查找缓存添加新行来工作。但是,在您的情况下,有一个问题:company_id 是在查找之后创建的(这是这样做的正确位置),因此无法将其添加到查找缓存中。

    我认为您可以配置 Lookup 以便:

    • 您激活选项Dynamic Lookup CacheUpdate Else InsertInsert Else Update
    • 您使用company_name 在源数据和查找数据之间进行比较
    • 您在 Lookup 之前创建了一个值为 0 的假字段 company_id,并将其与相应的 Lookup 字段相关联
    • 您在company_id 字段中选中复选框Disable in comparison
    • 然后您可以使用预定义字段NewLookupRow(当您选中Dynamic Lookup Cache 选项时会显示该字段),新行的值应为 1,更新的现有行的值应为 2(相同行的值为 0)李>

    查找现在应该为第一个Abc Ltd 输出NewLookupRow = 1,然后为第二个输出NewLookupRow = 0。 Lookup 之后的过滤器应该有一个类似NewLookupRow = 1 的条件。

    有关更多详细信息,您可以查看 Informatica 文档: https://docs.informatica.com/data-integration/data-services/10-2/developer-transformation-guide/dynamic-lookup-cache.html

    【讨论】:

    • 我已经补充说我使用了动态查找。这就是动态查找更新与正在更新的数据的基本区别,静态在整个第一次运行期间获取相同的数据。
    • 动态查找缓存仅从目标表构建一次,然后在映射运行期间从传入数据构建,它永远无法知道序列生成器创建的新company_ids。这就是为什么您必须在过滤器中使用 NewLookupRow 预定义字段,而不是 company_id 字段。
    • 查看上图以供参考
    • 我已经完成了,您的解释不正确,但详细说明不需要虚拟 companyid 等,我只是尝试调试 newlookup 行,但我无法进行任何更新,否则插入等,因为我不得不这样做拒绝所有重复。此外,我们不需要解释“因为查找缓存在映射开始时使用与数据库的单独连接加载一次。即使您禁用缓存(这意味着每个查找输入行一个查询),数据写入目标时不会立即提交(因此对其他连接不可见)。”。
    • 因为它非常简单明了,如果仅启用缓存,则缓存是静态的,这意味着即使所引用的表已更新,所收集的任何缓存仍保留在特定的查找运行中,它会将数据放入缓存在查找运行时可用的任何内容
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    相关资源
    最近更新 更多