Create an ETL transform map
-
- UpdatedJan 30, 2025
- 30 minutes to read
- Yokohama
- Now Platform Capabilities
IntegrationHub ETL provides a guided setup which walks you through the completion of all necessary tasks for creating an ETL transform map for a specific integration.
Guided setup
Guided setup organizes all the tasks in the correct order, tracks the completion of tasks, and enforces any task dependencies. Tasks that depend on the completion of other tasks, are enabled or disabled as you step through the tool and complete tasks.
Use guided setup on the ETL Transform Map Assistant page to complete the following tasks.
Import source data and specify basic details
Provide basic details for the integration, such as the source of the data that you want to integrate into CMDB, and import the source data.
Before you begin
The data source that you plan to select for the ETL Transform Map must exist in the same application scope as the one being used in the current session.
When you open an ETL transform map, by default the map is not validated. You can enable this validation step by adding the system property sn_int_studio.validation.enabled to the System Properties [sys_properties] table and then setting it to true. After validation is complete, you choose how to handle validation errors.
Role required: cmdb_inst_admin
Procedure
Preview and prepare data
Review sample records of raw source data, which will be integrated into the CMDB. Transform and prepare data to align with the target classes and attributes, if needed.
Before you begin
The number of records in the sample data is globally determined by the system property sn_int_studio.preview.size, which is set to 100 by default. The maximum number of records in the sample data that IntegrationHub ETL can process is 10,000. If you set that property above the 10,000 limit, then IntegrationHub ETL will only process up to 10,000 records and a message will appear to that effect.
Starting with IntegrationHub ETL v3.2, you can override the value of the sn_int_studio.preview.size property by setting the Preview Size Override field on the Import Source Data and Provide Basic Details form, per map.
To process nested data from a nested payload, the respective data source must be set with the Data in single column option.
Role required: cmdb_inst_admin
About this task
Columns for nested data appear alongside the rest of the data, with a Nested Objects notation in the data column header. The count of nested data items per object appear with a link which lets you drill to deeper levels of the nested data. To show the data structure of nested data in a separate panel, enable the Show data structure option.
The Data Structure panel has two options for displaying nested data:
- Tree: Nested data grouped by objects, where each object node corresponds to a record entry in the source data. Expand object nodes to show all nested data for the record.
- Collection: Nested data grouped by the top-level object (by default) and then by nested data items such as software. Expand a node such as software, to show which software is installed on each computer.
For a demo about working with nested payload data, watch the Integration Hub - ETL nested payload feature demo video on the ServiceNow YouTube channel.
Procedure
Result
About mapping data columns to CMDB classes and attributes
There are several requirements and guidelines for mapping source data to target CMDB classes and attributes. Also, there is an option of deactivating class mappings while preserving the settings for an easy reactivation. Review these concepts to ensure proper processing by the Identification and Reconciliation Engine (IRE).
Required mappings
- Source Native Key
- IRE uses to uniquely identify a record and for building relationships and references. Also, improves performance of insert and update operations. When processing a payload, IRE generates an error if this field is empty.
- Source Recency Timestamp
IRE uses to identify records that are older than the current record and therefore can be ignored, to help resolve conflicting attribute values. If a value is provided, it is used only if it is later than the value that is currently stored in the CMDB. If a value is not provided, IRE updates the attribute with the current timestamp.
The following system properties let you modify how IRE uses the source_recency_timestamp value in a payload to update the last_scan attribute in the Source [sys_object_source] table:
Conditional class
A conditional class lets you map different sets of data records to different target classes according to specific column values, or the status of a specific plugin.
For example, if a display name contains 'Windows', then 'Windows Server' is selected as the target class. But if the display name contains 'Linux', then 'Linux Server' is selected as the target class. For records that do not meet any of these conditions (display name does not contain 'Windows' nor 'Linux'), 'Server' is selected as the target class.
Associated class
An associated class lets you select the CMDB class to be associated with a target non-CMDB table. Setting an associated class is required for IRE processing if the non-CMDB table is not configured for IRE processing. For a non-CMDB table that is supported and configured for IRE processing, setting an associated class is optional. See IRE support for non-CMDB tables for more information.
The software Instance is a non-CMDB class but it does not have IRE rules associated with it. So, things we said about it here pre-Utah are still valid. But for non-CMDB classes with IRE rules it's not mandatory to have an association. For example “If the target class for mapping is a non-CMDB class with a reference to a CMDB class, you must select the CMDB class to associate the non-CMDB target class with” non-CMDB class with IRE rules Instead of “you must” it should be. “You can”. Same with the Example it's not valid for non-CMDB with IRE rules.
If the target class for mapping is a non-CMDB class with a reference to a CMDB class, you must select the CMDB class to associate the non-CMDB target class with. A non-CMDB class refers to a class, such Serial Number [cmdb_serial_number], that does not extend the Configuration Item [cmdb_ci] class. The Related Entry [cmdb_related_entry] class might contain multiple CMDB class associations for the same non-CMDB class. Therefore, select the appropriate association to allow IRE processes to update the target non-CMDB class.
For example, the Related Entry [cmdb_related_entry] class has a record which associates the non-CMDB Software Instance [cmdb_software_instance] class with the CMDB Software Package [cmdb_ci_spkg] class. If you select Software Instance as a target class, you must associate the Software Instance class with the Software Package [cmdb_ci_spkg] class.
Deactivating class mappings
When you edit an ETL transform map, provided by a Service Graph Connector for example, you can delete a class mapping to prevent the class from being populated when the integration runs. However, if you later decide to populate that class, you must readd that class and reconfigure all the class mappings. Instead, you can deactivate a class mapping to temporarily ignore the class during the integration run, while preserving all of its mapping configuration. A class that you choose to deactivate is grayed out in the user interface but you can continue and edit the class mappings. Later, you can reactivate a class mapping to enable populating the class, without needing to reconfigure the class mappings.
- Appear in light gray in the user interface and you can't reactivate them.
- Are automatically reactivated when you reactivate:
- The class that you initially deactivated which triggered the automatic deactivation
- Any class that the deactivated class depends on
All classes that you directly deactivate mappings for and the resulting class mappings that are automatically deactivated, are not populated when the integration runs. Also, any relationships and lookup tables associated with those classes, are not populated when the integration runs.
- Deactivate a class which no class depends on and which has no associated classes:
Triggers an automatic deactivation of any lookup rules and relationships associated with the deactivated class.
- Deactivate a lookup rule, such as serial number, within a class mapping:
Does not trigger any automatic deactivations.
- Deactivate a CMDB class which is associated with a non-CMDB class:
- Triggers an automatic deactivation of the associated non-CMDB class.
- Deactivating the non-CMDB class, does not impact the associated CMDB class.
- Deactivate a class with dependent relationships (Applies only if the dependent relationship exists in IntegrationHub ETL):
- Triggers an automatic deactivation of any class that has a single dependent relationship with the deactivated class.
If a class has multiple dependent relationships, then it is automatically deactivated only when you deactivate all of the dependent on classes.
For example, a scenario in which the File System class has dependent relationships with both, the Computer and a Server class. If you deactivate the Computer class, the File System class is not automatically deactivated. Only if you also deactivate the Server class, the File System class is automatically deactivated.
- Deactivate a conditional class or a class mapping within a conditional class:
- Deactivating or activating a conditional class, triggers an automatic deactivation or activation of all conditional class mappings within the conditional class.
Deactivating a class mapping within a conditional class: Prevents the deactivated class from getting populated during integration runs. However, the associated 'If', 'Else if', or 'Else' conditions themselves remain in effect within the condition of the conditional class. For example, if you deactivate the following class mapping:
[If] [operating_system] [contains] [Linux] Then [Class] [is] [Linux Server].
Then, the Linux Server class is not populated, but the [If] [operating_system] [contains] [Linux] condition is in effect.
Map data columns to CMDB classes and attributes
Choose target classes and attributes in the CMDB to map source data columns to. You can map a data column to a specific target class, or add conditions so that the choice of target class depends on specific data values.
Before you begin
About this task
Data columns that you map can be either source data columns which were not transformed, or transformed data columns. For example, to integrate a data column into the Computer and Software Package classes, select those classes as target classes and then map data columns into specific attributes in those classes.
When you configure mapping for a class, relationship, or a lookup rule, those items are always initially set as activated. For details about the results of deactivating mappings, see Deactivating class mappings.
Procedure
Add Relationships
Add relationships that exist among the target CMDB classes, for an integration.
Before you begin
- A class that you want to add in the relationship, must be in an activated state.
- A base relationship or a relationship within a conditional relationship, that you want to edit, must be in an activated state.
- In a conditional relationship that you want to edit, at least one relationship condition must be in an activated state. Otherwise, the Edit Relationship button is grayed out.
Role required: cmdb_inst_admin
About this task
When creating relationships with nested data, you can't create a relationship between sibling objects from the nested data. Using the sample payload for nested data as an example, you can't create a relationship between interfaces and software.
ITOM Visibility, if available, uses enhanced discovery patterns to identify and add CI relationships to the Suggested Relationships table in the base system. When applicable, use the Suggested Relationships table to select relationships that are in compliance with Common Service Data Model (CSDM) standards.
Procedure
Preview mapping results
Preview the results of the sample data integration.
Before you begin
About this task
After you view the details in the summary page, you can return to any step to make adjustments and then rerun the integration.
Procedure
Provide integration schedule
Configure a schedule for importing data to CMDB using this ETL Transform Map.
Before you begin
Procedure
Transform types in IntegrationHub ETL
Use various transforms in IntegrationHub ETL to convert and prepare source data for mapping to the CMDB.
Transforms from the Integration Commons for CMDB store app, are also available in IntegrationHub ETL.
Concatenation
Combines the values from input fields into a single string, joining them on the optional joining_string field.
Example | |
---|---|
Input | “input_1”, “input_2”, “input_3” |
Additional Fields | joining_string = ”, ” |
Result | “input_1, input_2, input_3” |
Convert to Boolean
Converts the incoming value to a boolean. ‘true’ and ‘1’ values convert to 'true' (case insensitive), and any other values convert to 'false'.
Details | |
---|---|
Table | sys_rte_eb_to_boolean_operation |
Input fields | source_sys_rte_eb_field |
Output field | target_sys_rte_eb_field |
- All of the following inputs return 'true':
- true
- 1
- All of the following inputs return 'false':
- “input_1”
- “”
- 0
- 11
Convert to Date
Attempts to convert the incoming value to a GlideDateTime value by applying the date_format to the incoming value. Attempts to directly convert using GlideDateTime if the date_format is incorrect.
Example | |
---|---|
Input | "2018/09/20 11:21:00 a.m. EST” |
Additional Fields | date_format = “yyyy/MM/dd hh:mm:ss a z” |
Result | “2018-09-20 16:21:00” |
Example | |
---|---|
Input | "2018/09/20 01:21:00 PM EST” |
Additional Fields | date_format = “yyyy/MM/dd hh:mm:ss a z” |
Result | “2018-09-20 18:21:00” |
Example | |
---|---|
Input | "09/20/18” |
Additional Fields | date_format = “yyyy/MM/dd hh:mm:ss a z” |
Result | “0018-09-20 00:00:00” |
Convert to Numeric
Converts the incoming value to a number.
Details | |
---|---|
Table | sys_rte_eb_to_numeric_operation |
Input fields | source_sys_rte_eb_field |
Output field | target_sys_rte_eb_field
If the incoming value is non-numeric, then the output is empty. |
Example | |
---|---|
Input | 1.23 |
Result | 1.23 |
Example | |
---|---|
Input | 1.00 |
Result | 1 |
Example | |
---|---|
Input | input_1 |
Result | null |
Example | |
---|---|
Input | two |
Result | null |
Copy
Copies the source field’s value to all of the target fields.
Extract Leading Numeric
Sets the target field to be the first numeric value found in the source field.
Example | |
---|---|
Input | “100 mb” |
Result | "100” |
Example | |
---|---|
Input | “100.123 mb” |
Result | “100.123" |
Example | |
---|---|
Input | “100.123 mb” |
Additional Fields | decimal_places = 2 |
Result | “100.12” |
Example | |
---|---|
Input | “100 mb” |
Additional Fields | decimal_places = 2 |
Result | “100.00” |
Example | |
---|---|
Input | “100 mb” |
Additional Fields | remainder_target_field = <field> |
Result | “100” and <field> = “mb” |
Glide Lookup
Performs a lookup in the database on the target_table.
Example | |
---|---|
Input |
|
Additional Fields |
|
Result | Output Field 1: 25ab9c4d0a0a0bb300f7dabdc0ca7c1c |
Min/Max
Sets the target field to either the maximum or minimum of the values from all input fields.
Example | |
---|---|
Input | “2”, “-1”, “0” |
Additional Fields |
|
Result | “2” |
Example | |
---|---|
Input | “a”, “b” |
Additional Fields |
|
Result | “b” |
Example | |
---|---|
Input | “2”, “-1”, “0” |
Additional Fields |
|
Result | “-1” |
Example | |
---|---|
Input | “a”, “b” |
Additional Fields |
|
Result | “a” |
Multiple Input Script
Runs a script with multiple inputs, setting the target_field == output for that script.
Each source field is available inside of the ‘batch’ variable as JavScript fields. The name of the JavaScript field is the field attribute of the entity field (looking at sys_rte_eb_field.field, not sys_rte_eb_field.name).
Record | record_type | operating_system | record_with_os |
---|---|---|---|
1 | computer | Windows XP | |
2 | computer | Linux | |
3 | computer | Windows XP |
Rexeg Replace
Replaces each substring of the incoming string that matches the specified match_regex, with the specified replacement_regex string value.
Example | |
---|---|
Input | “String&With(Special)$Characters” |
Additional Fields |
|
Result | “String With Special Characters” |
Replace
Replaces each substring in the incoming string that matches the specified match_string, with the replacement_string string value.
Example | |
---|---|
Input | “Original String” |
Additional Fields |
|
Result | “Replacement String” |
Round Numeric
Rounds the number value to the nearest whole number. Non-numbers are truncated.
Details | |
---|---|
Table | sys_rte_eb_round_numeric_operation |
Input fields | source_sys_rte_eb_field |
Output field | target_sys_rte_eb_field |
Example | |
---|---|
Input | “1.5” |
Result | "2" |
Example | |
---|---|
Input | “1.4” |
Result | "1" |
Example | |
---|---|
Input | “i’m a string” |
Result | "" |
Script
Runs a script with input, setting the target_field == output for that script.
This transform has been superseded by the Multi Input Script transform and is included for backwards compatibility with existing configurations.
Set
Sets the target field’s value to the string specified in set_value.
Split
Splits the source field’s value on the splitting_string and assigns each resulting item from the split to the target_sys_rte_eb_fields, in order.
Example | |
---|---|
Input | “value1||value2||value3”, with target_sys_rte_eb_fields {target1,target2,target3} |
Additional Fields | splitting_string = ”||” |
Result | target1 : value1, target2 : value2, target3 : value3 |
Example | |
---|---|
Input | “value1||value2||value3”, with target_sys_rte_eb_fields {target1} |
Additional Fields | splitting_string = ”||” |
Result | target1 : value1 |
Example | |
---|---|
Input | “value1”, with target_sys_rte_eb_fields {target1,target2,target3} |
Additional Fields | splitting_string = ”||” |
Result | target1 : value1, target2 : <null>, target3 : <null> |
Trim
Trims leading and trailing whitespace from the source_sys_rte_eb_field value and assigns the result to the target_sys_rte_eb_field. This transform is equivalent to a Java String.trim().
Details | |
---|---|
Table | sys_rte_eb_trim_operation |
Input fields | source_sys_rte_eb_field |
Output field | target_sys_rte_eb_field |
Example | |
---|---|
Input | “ value 1 ” |
Result | “value 1” |
Uppercase
Uppercases the source_sys_rte_eb_field value and assigns the result to target_sys_rte_eb_field.
Details | |
---|---|
Table | sys_rte_eb_upper_case_operation |
Input fields | source_sys_rte_eb_field |
Output field | target_sys_rte_eb_field |
Example | |
---|---|
Input | “value1” |
Result | “VALUE1” |
Uppercase Trim
Combines both the Uppercase and the Trim transforms.
Details | |
---|---|
Table | sys_rte_eb_upper_case_trim_operation |
Input fields | source_sys_rte_eb_field |
Output field | target_sys_rte_eb_field |
Example | |
---|---|
Input | “ value1 ” |
Result | “VALUE1” |