Area: Ingestion Issues
Sub-Area: CSV Enricher Configuration
Issue
When using the csv-enricher to assign multiple ownership types to the same asset through PATCH mode, only one ownership type is applied despite providing separate rows for each ownership type. This occurs because each CSV row generates an independent work unit that overwrites the entire Ownership aspect, causing the last processed row to overwrite previous ownership assignments.
Error Messages
- No specific error is thrown - the ingestion appears successful but only one ownership type persists
You Might Be Asking
- Why is only one ownership type being assigned when I have multiple rows in my CSV?
- How can I assign the same owner to multiple ownership types using csv-enricher?
- Is there a workaround for bulk assigning multiple ownership types?
Solution
This is a known limitation in the csv-enricher's PATCH mode that has been resolved in DataHub version 0.3.18. Here are your options:
-
Upgrade to DataHub 0.3.18 or later:
The proper fix for multiple ownership types in csv-enricher PATCH mode is available in version 0.3.18. After upgrading, your existing CSV format will work correctly:
resource,owners,ownership_type,ownership_type_urn "urn:li:dataset:(urn:li:dataPlatform:dynamodb,,PROD)",[urn:li:corpGroup: ],CUSTOM,urn:li:ownershipType:__system__technical_owner "urn:li:dataset:(urn:li:dataPlatform:dynamodb, ,PROD)",[urn:li:corpGroup: ],CUSTOM,urn:li:ownershipType:__system__business_owner -
Use the Python SDK (workaround for older versions):
Create a custom script that can properly handle multiple ownership types:
from datahub.emitter.rest_emitter import DatahubRestEmitter from datahub.metadata.schema_classes import OwnerClass, OwnershipClass, OwnershipTypeClass from datahub.metadata.com.linkedin.pegasus2avro.mxe import MetadataChangeProposal # Create multiple owners with different types owners = [ OwnerClass( owner="urn:li:corpGroup:", type=OwnershipTypeClass.CUSTOM, typeUrn="urn:li:ownershipType:__system__technical_owner" ), OwnerClass( owner="urn:li:corpGroup: ", type=OwnershipTypeClass.CUSTOM, typeUrn="urn:li:ownershipType:__system__business_owner" ) ] ownership = OwnershipClass(owners=owners) # Emit using MetadataChangeProposalWrapper -
Use GraphQL or REST API:
Make direct API calls to add both ownership types in a single request, avoiding the overwrite issue entirely.
Additional Notes
This limitation existed in csv-enricher PATCH mode from early versions through 0.3.17. A fix was initially attempted in October 2025 but was reverted due to backwards compatibility concerns. The issue was properly resolved in version 0.3.18 with PR #16906. Running separate csv-enricher jobs for each ownership type will not work as each run still overwrites the entire Ownership aspect.
Related Documentation
Tags: csv-enricher, ownership, patch-mode, bulk-ingestion, multiple-owners, ownership-types, ingestion-limitations, python-sdk, api-workaround, version-upgrade