跳到主要内容 跳到补充内容

添加 SQL 转换

可以在转换任务中包含基于 SQL 的表。SQL 转换允许您将 SQL SELECT 查询输入到管道中,以定义复杂或简单的转换。如果执行了初始加载或增量加载,则也可以使用宏调整查询以运行。

有关创建转换任务的详细信息,请参阅转换数据

添加 SQL 转换

要在转换数据任务中添加 SQL 转换,请执行以下操作:

  1. 转换中,选择要包含在查询中的数据集,然后单击添加 SQL 转换

    将显示添加 SQL 转换,您可以在其中提供转换的设置。

  2. 名称中输入目标数据集的名称。

    也可以在描述中添加较长的说明。

  3. 具体化中,选择转换后的输出是否应具体化。您可以选择从数据任务设置中继承设置。

    • 如果开启,将创建表格并处理相关的 ELT 处理。

    • 选择关闭将创建即时执行转换的视图。

  4. 增量加载允许您通过应用筛选器或其他条件来调整增量数据加载的查询,以减少使用宏处理的数据集。只有当数据具体化为表时,增量加载才可用。

    • 如果增量加载开启

      任务的第一次执行将执行初始加载,将查询的所有结果插入到目标表中。后续执行将利用您为增量处理定义的筛选器或特定条件执行增量加载。在增量加载期间,任务将只把数据作为更新或插入处理,不管理删除。

    • 如果增量加载关闭

      任务的第一次执行将执行初始加载,将查询的所有结果插入到目标表中。后续执行将通过与目标表进行比较来处理查询的所有结果,并处理新的、更改的或删除的记录。

    信息注释如果查询将选择目标中应该存在的所有记录,请将增量加载设置为关闭。将从目标中删除未选择的记录。
  5. 当您准备好创建 SQL 转换时,单击添加

    显示编辑 SQL 转变

  6. 键入查询以在 SELECT 查询中返回基于 SQL 的表。

    查询只能读取您选择的源数据集,但您可以使用添加来添加更多源数据集。

    您可以从数据集中进行选择。

  7. 如果使用增量加载,则可以使用调整查询以在执行初始加载或增量加载时运行。

    有关详细信息,请参阅使用宏使查询适应加载类型

  8. 单击提取参数以分析 SELECT 查询中的参数。

    参数应映射到源对象或目标对象。您可以映射至

    • 历史 2 型结构 (_history)

    • 当前结构

    • 目标对象

      只有在增量宏中定义参数时,才能映射目标对象。

    提示注释您可以用引用替换参数,以使查询更易于阅读。更改参数r中的值,SELECT 查询中的引用也将更改。
  9. 单击描述表以获取查询输出元数据的预览。

    您还可以使用数据示例预览结果。

    预览数据

  10. 请确保该表具有主键。

    您还可以编辑元数据设置。

    • 列中设置主键。

    • 如果列在 Nullable 列中是可为 Null 的,则进行设置。

    • 选择一列,单击编辑按钮,设置列名、键、可为 null 的项和数据类型。

  11. 如果对查询结果满意,单击确定。数据集现在被添加到目标列表中,您可以预览它。

预览数据

您可以使用数据示例预览结果。

信息注释必须在 Qlik Management Console 中的租户级别启用数据预览。可以在设定中的特性控制下找到数据集成 中查看数据选项。

必须为您分配以下角色才能预览数据:

  • 数据连接所在空间中的可以查看数据

  • 数据项目所在空间中的可以查看

要查看结果的预览:

  • 单击查看数据

将显示使用数据样本的结果。可以使用行数设置要包含在示例中的数据行数。

您可以通过两种方式筛选样本数据:

  • 使用 筛选器 筛选要检索的样本数据。

    例如,如果您使用筛选器 ${OrderYear}>2023,并且行数设置为 10,那么您将从 2024 年获得 10 个订单的样本。

  • 按特定列筛选示例数据。

    这只会影响现有的样本数据。如果您使用 筛选器 以只包括 2024 年的订单,并将列筛选器设置为显示 2022 年的订单时,结果为空样本。

您可以按特定列对数据样本进行排序。排序只会影响现有的样本数据。如果您使用 筛选器 只包括 2024 年的订单并反转排序顺序,则示例数据仍将只包含 2024 年以来的订单。

使用宏使查询适应加载类型

如果使用增量加载,则可以使用调整查询以在执行初始加载或增量加载时运行。

选择宏并将查询添加到相应的子句中。

  • Q_RUN_INCREMENTAL 添加了一个子句,您可以在其中放置仅在执行增量加载时运行的查询。

  • Q_RUN_INITIAL_LOAD 添加了一个子句,您可以在其中放置仅在执行初始加载时运行的查询。

不需要为每个宏指定完整的查询。您可以根据您的用例调整或添加代码。.

用例:使用日期范围的增量筛选器:

在这个用例中,需要使用自定义 SQL 转换一组订单数据。由于这是一个大型数据集,您希望包括增量筛选,以确保增量负载只考虑过去 12 小时的订单。

这是基本查询:

SELECT O.ORDER_ID, O.CUSTOMER_ID, OD.PRODUCT_ID, OD.QUANTITY, O.AMOUNT , OD.LAST_UPDATE_DTM FROM “mydb”.”myStorageTask”.”ORDER” O JOIN “mydb”.”myStorageTask”.”ORDER_DETAIL” OD ON O.ORDER_ID = OD.ORDER_ID

这是在增量运行期间应用的筛选器,您只考虑过去 12 小时内添加的订单:

WHERE OD.UPDATE_DTM > DATEADD(hour, -12, CURRENT_TIMESTAMP())
提示注释在实现基于 SQL 的表时,建议使用 ${TABLE} 符号替换表名。这可以防止对数据库和模式名称进行硬编码,这些名称可能会随着环境的变化而变化,例如在从开发转移到生产时。

这是一个完整的查询,使用筛选器宏,表名用 ${TABLE} 符号替换:

SELECT O.ORDER_ID, O.CUSTOMER_ID, OD.PRODUCT_ID, OD.QUANTITY, O.AMOUNT , OD.LAST_UPDATE_DTM FROM ${ORDER} O JOIN ${ORDER_DETAIL} OD ON O.ORDER_ID = OD.ORDER_ID {{#QLIK_FUNC_IF Q_RUN_INCREMENTAL}} WHERE OD.UPDATE_DTM > DATEADD(hour, -12, CURRENT_TIMESTAMP() ) {{/QLIK_FUNC_IF}}

这将产生一个初始加载查询:

SELECT O.ORDER_ID, O.CUSTOMER_ID, OD.PRODUCT_ID, OD.QUANTITY, O.AMOUNT , OD.LAST_UPDATE_DTM FROM ${ORDER} O JOIN ${ORDER_DETAIL} OD ON O.ORDER_ID = OD.ORDER_ID

以及增量加载查询:

SELECT O.ORDER_ID, O.CUSTOMER_ID, OD.PRODUCT_ID, OD.QUANTITY, O.AMOUNT , OD.LAST_UPDATE_DTM FROM ${ORDER} O JOIN ${ORDER_DETAIL} OD ON O.ORDER_ID = OD.ORDER_ID WHERE OD.UPDATE_DTM > DATEADD(hour, -12, CURRENT_TIMESTAMP() )

用例:使用目标中的数据进行增量筛选:

在这个用例中,需要使用自定义 SQL 转换一组订单数据。由于订单是一个大型数据集,因此需要包括增量筛选,以确保增量加载只考虑比目标表中的数据更新的订单详细信息记录。您还需要标记一行是由初始加载还是增量加载处理的。

信息注释正如您在本例中看到的那样,宏可以用于调整查询的任何部分以进行初始加载或增量加载。

这是基本查询:

SELECT O.ORDER_ID, O.CUSTOMER_ID, OD.PRODUCT_ID, OD.QUANTITY, O.AMOUNT , OD.LAST_UPDATE_DTM FROM “mydb”.”myStorageTask”.”ORDER” O JOIN “mydb”.”myStorageTask”.”ORDER_DETAIL” OD ON O.ORDER_ID = OD.ORDER_ID

这是要在增量运行期间应用的筛选器。“ORDERS_DERIVED” 是目标数据集的名称。

WHERE OD.UPDATE_DTM > = (SELECT MAX(LAST_UPDATE_DTM) FROM “mydb”,”myTrasformTask”.”ORDERS_DERIVED” )
提示注释增量加载还可以将 ${TABLE} 符号映射到由转换任务创建的目标对象。

这是一个完整的查询,使用筛选器宏,表名用 ${TABLE} 符号替换。如果负载是初始的,则 LOADED_BY 设置为 INIT,如果负载是增量的,则为 INCR

SELECT O.ORDER_ID, O.CUSTOMER_ID, OD.PRODUCT_ID, OD.QUANTITY, O.AMOUNT, OD.LAST_UPDATE_DTM, {{#QLIK_FUNC_IF Q_RUN_INITIAL_LOAD}} ‘INIT’ as LOADED_BY {{/QLIK_FUNC_IF}} {{#QLIK_FUNC_IF Q_RUN_INCREMENTAL}} ‘INCR’ as LOADED_BY {{/QLIK_FUNC_IF}} FROM ${ORDER} O JOIN ${ORDER_DETAIL} OD ON O.ORDER_ID = OD.ORDER_ID {{#QLIK_FUNC_IF Q_RUN_INCREMENTAL}} WHERE OD.UPDATE_DTM >= (SELECT MAX(LAST_UPDATE_DTM) FROM ${TARGET_TABLE} ) {{/QLIK_FUNC_IF}}

这将产生一个初始加载查询:

SELECT O.ORDER_ID, O.CUSTOMER_ID, OD.PRODUCT_ID, OD.QUANTITY, O.AMOUNT, OD.LAST_UPDATE_DTM, ‘INIT’ as LOADED_BY FROM ${ORDER} O JOIN ${ORDER_DETAIL} OD ON O.ORDER_ID = OD.ORDER_ID

以及增量加载查询:

SELECT O.ORDER_ID, O.CUSTOMER_ID, OD.PRODUCT_ID, OD.QUANTITY, O.AMOUNT, OD.LAST_UPDATE_DTM, ‘INCR’ as LOADED_BY FROM ${ORDER} O JOIN ${ORDER_DETAIL} OD ON O.ORDER_ID = OD.ORDER_ID WHERE OD.UPDATE_DTM >= (SELECT MAX(LAST_UPDATE_DTM) FROM ${TARGET_TABLE} )

最佳实践

  • 添加 SQL 转换时,不会自动定义主键。在数据集选项卡中向数据集添加键。

  • 不要在转换后的输出中手动创建列标题。

  • 避免将 SELECT 与 * 一起使用,因为每次运行查询时这都可能返回不同的列。如果模式发生了更改,请相应地更改查询,然后再次执行描述表。然后可以编辑列和调整表。

本页面有帮助吗?

如果您发现此页面或其内容有任何问题 – 打字错误、遗漏步骤或技术错误 – 请告诉我们如何改进!