diff --git a/datahub-web-react/src/app/ingest/source/builder/constants.ts b/datahub-web-react/src/app/ingest/source/builder/constants.ts index f892f0ed525d25..58525b3e88f975 100644 --- a/datahub-web-react/src/app/ingest/source/builder/constants.ts +++ b/datahub-web-react/src/app/ingest/source/builder/constants.ts @@ -38,6 +38,7 @@ import sigmaLogo from '../../../../images/sigmalogo.png'; import sacLogo from '../../../../images/saclogo.svg'; import cassandraLogo from '../../../../images/cassandralogo.png'; import datahubLogo from '../../../../images/datahublogo.png'; +import neo4j from '../../../../images/neo4j.png'; export const ATHENA = 'athena'; export const ATHENA_URN = `urn:li:dataPlatform:${ATHENA}`; @@ -137,6 +138,8 @@ export const DATAHUB_GC = 'datahub-gc'; export const DATAHUB_LINEAGE_FILE = 'datahub-lineage-file'; export const DATAHUB_BUSINESS_GLOSSARY = 'datahub-business-glossary'; export const DATAHUB_URN = `urn:li:dataPlatform:${DATAHUB}`; +export const NEO4J = 'neo4j'; +export const NEO4J_URN = `urn:li:dataPlatform:${NEO4J}`; export const PLATFORM_URN_TO_LOGO = { [ATHENA_URN]: athenaLogo, @@ -180,6 +183,7 @@ export const PLATFORM_URN_TO_LOGO = { [SAC_URN]: sacLogo, [CASSANDRA_URN]: cassandraLogo, [DATAHUB_URN]: datahubLogo, + [NEO4J_URN]: neo4j, }; export const SOURCE_TO_PLATFORM_URN = { diff --git a/datahub-web-react/src/app/ingest/source/builder/sources.json b/datahub-web-react/src/app/ingest/source/builder/sources.json index 70d9baabdb4bc6..776b6703895c35 100644 --- a/datahub-web-react/src/app/ingest/source/builder/sources.json +++ b/datahub-web-react/src/app/ingest/source/builder/sources.json @@ -309,7 +309,7 @@ "displayName": "Dremio", "description": "Import Spaces, Sources, Tables and statistics from Dremio.", "docsUrl": "https://datahubproject.io/docs/metadata-ingestion/", - "recipe": "source:\n type: dremio\n config:\n # Coordinates\n hostname: null\n port: null\n #true if https, otherwise false\n tls: true\n\n #For cloud instance\n #is_dremio_cloud: True\n #dremio_cloud_project_id: \n\n #Credentials with personal access token\n authentication_method: PAT\n password: pass\n\n #Or Credentials with basic auth\n #authentication_method: password\n #username: null\n #password: null\n\n stateful_ingestion:\n enabled: true" + "recipe": "source:\n type: dremio\n config:\n # Coordinates\n hostname: null\n port: null\n #true if https, otherwise false\n tls: true\n\n #For cloud instance\n #is_dremio_cloud: True\n #dremio_cloud_project_id: \n\n #Credentials with personal access token\n authentication_method: PAT\n password: pass\n\n #Or Credentials with basic auth\n #authentication_method: password\n #username: null\n #password: null\n\n ingest_owner: true\n\n stateful_ingestion:\n enabled: true" }, { "urn": "urn:li:dataPlatform:cassandra", @@ -325,5 +325,13 @@ "description": "Ingest databases and tables from any Iceberg catalog implementation", "docsUrl": "https://datahubproject.io/docs/generated/ingestion/sources/iceberg", "recipe": "source:\n type: \"iceberg\"\n config:\n env: dev\n # each thread will open internet connections to fetch manifest files independently, \n # this value needs to be adjusted with ulimit\n processing_threads: 1 \n # a single catalog definition with a form of a dictionary\n catalog: \n demo: # name of the catalog\n type: \"rest\" # other types are available\n uri: \"uri\"\n s3.access-key-id: \"access-key\"\n s3.secret-access-key: \"secret-access-key\"\n s3.region: \"aws-region\"\n profiling:\n enabled: false\n" + }, + { + "urn": "urn:li:dataPlatform:neo4j", + "name": "neo4j", + "displayName": "Neo4j", + "description": "Import Nodes and Relationships from Neo4j.", + "docsUrl": "https://datahubproject.io/docs/generated/ingestion/sources/neo4j/", + "recipe": "source:\n type: 'neo4j'\n config:\n uri: 'neo4j+ssc://host:7687'\n username: 'neo4j'\n password: 'password'\n env: 'PROD'\n\nsink:\n type: \"datahub-rest\"\n config:\n server: 'http://localhost:8080'" } ] diff --git a/datahub-web-react/src/images/neo4j.png b/datahub-web-react/src/images/neo4j.png new file mode 100644 index 00000000000000..b03b2a4532b3ba Binary files /dev/null and b/datahub-web-react/src/images/neo4j.png differ diff --git a/entity-registry/src/main/java/com/linkedin/metadata/aspect/patch/builder/CustomPropertiesPatchBuilder.java b/entity-registry/src/main/java/com/linkedin/metadata/aspect/patch/builder/CustomPropertiesPatchBuilder.java index e4143851afbe51..b78d563147e636 100644 --- a/entity-registry/src/main/java/com/linkedin/metadata/aspect/patch/builder/CustomPropertiesPatchBuilder.java +++ b/entity-registry/src/main/java/com/linkedin/metadata/aspect/patch/builder/CustomPropertiesPatchBuilder.java @@ -17,10 +17,16 @@ public class CustomPropertiesPatchBuilder> operations = new ArrayList<>(); + private final List> operations; public CustomPropertiesPatchBuilder(T parentBuilder) { this.parent = parentBuilder; + if (parentBuilder != null) { + // If a parent builder is provided, we use the same path operations list. + this.operations = parentBuilder.getPathValues(); + } else { + this.operations = new ArrayList<>(); + } } /** @@ -72,9 +78,4 @@ public CustomPropertiesPatchBuilder setProperties(Map propert public T getParent() { return parent; } - - @Override - public List> getSubPaths() { - return operations; - } } diff --git a/entity-registry/src/main/java/com/linkedin/metadata/aspect/patch/builder/DataFlowInfoPatchBuilder.java b/entity-registry/src/main/java/com/linkedin/metadata/aspect/patch/builder/DataFlowInfoPatchBuilder.java index 6a114d90875fe3..231956a2fcec81 100644 --- a/entity-registry/src/main/java/com/linkedin/metadata/aspect/patch/builder/DataFlowInfoPatchBuilder.java +++ b/entity-registry/src/main/java/com/linkedin/metadata/aspect/patch/builder/DataFlowInfoPatchBuilder.java @@ -4,12 +4,10 @@ import static com.linkedin.metadata.Constants.DATA_FLOW_ENTITY_NAME; import static com.linkedin.metadata.Constants.DATA_FLOW_INFO_ASPECT_NAME; -import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.linkedin.common.TimeStamp; import com.linkedin.metadata.aspect.patch.PatchOperationType; import com.linkedin.metadata.aspect.patch.builder.subtypesupport.CustomPropertiesPatchBuilderSupport; -import java.util.List; import java.util.Map; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -87,28 +85,23 @@ public DataFlowInfoPatchBuilder setCreated(@Nullable TimeStamp created) { } public DataFlowInfoPatchBuilder setLastModified(@Nullable TimeStamp lastModified) { + ObjectNode lastModifiedNode = instance.objectNode(); if (lastModified == null) { pathValues.add( ImmutableTriple.of( PatchOperationType.REMOVE.getValue(), BASE_PATH + LAST_MODIFIED_KEY, null)); + } else { + lastModifiedNode.put(TIME_KEY, lastModified.getTime()); + if (lastModified.getActor() != null) { + lastModifiedNode.put(ACTOR_KEY, lastModified.getActor().toString()); + } + pathValues.add( + ImmutableTriple.of( + PatchOperationType.ADD.getValue(), BASE_PATH + LAST_MODIFIED_KEY, lastModifiedNode)); } - ObjectNode lastModifiedNode = instance.objectNode(); - lastModifiedNode.put(TIME_KEY, lastModified.getTime()); - if (lastModified.getActor() != null) { - lastModifiedNode.put(ACTOR_KEY, lastModified.getActor().toString()); - } - pathValues.add( - ImmutableTriple.of( - PatchOperationType.ADD.getValue(), BASE_PATH + LAST_MODIFIED_KEY, lastModifiedNode)); return this; } - @Override - protected List> getPathValues() { - pathValues.addAll(customPropertiesPatchBuilder.getSubPaths()); - return pathValues; - } - @Override protected String getAspectName() { return DATA_FLOW_INFO_ASPECT_NAME; diff --git a/entity-registry/src/main/java/com/linkedin/metadata/aspect/patch/builder/DataJobInfoPatchBuilder.java b/entity-registry/src/main/java/com/linkedin/metadata/aspect/patch/builder/DataJobInfoPatchBuilder.java index 99c0ac6c15eb1a..dd17fbacf338eb 100644 --- a/entity-registry/src/main/java/com/linkedin/metadata/aspect/patch/builder/DataJobInfoPatchBuilder.java +++ b/entity-registry/src/main/java/com/linkedin/metadata/aspect/patch/builder/DataJobInfoPatchBuilder.java @@ -4,13 +4,11 @@ import static com.linkedin.metadata.Constants.DATA_JOB_ENTITY_NAME; import static com.linkedin.metadata.Constants.DATA_JOB_INFO_ASPECT_NAME; -import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.linkedin.common.TimeStamp; import com.linkedin.common.urn.DataFlowUrn; import com.linkedin.metadata.aspect.patch.PatchOperationType; import com.linkedin.metadata.aspect.patch.builder.subtypesupport.CustomPropertiesPatchBuilderSupport; -import java.util.List; import java.util.Map; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -113,12 +111,6 @@ public DataJobInfoPatchBuilder setLastModified(@Nullable TimeStamp lastModified) return this; } - @Override - protected List> getPathValues() { - pathValues.addAll(customPropertiesPatchBuilder.getSubPaths()); - return pathValues; - } - @Override protected String getAspectName() { return DATA_JOB_INFO_ASPECT_NAME; diff --git a/entity-registry/src/main/java/com/linkedin/metadata/aspect/patch/builder/DatasetPropertiesPatchBuilder.java b/entity-registry/src/main/java/com/linkedin/metadata/aspect/patch/builder/DatasetPropertiesPatchBuilder.java index 31e181fc244fba..60d52c7c720881 100644 --- a/entity-registry/src/main/java/com/linkedin/metadata/aspect/patch/builder/DatasetPropertiesPatchBuilder.java +++ b/entity-registry/src/main/java/com/linkedin/metadata/aspect/patch/builder/DatasetPropertiesPatchBuilder.java @@ -4,10 +4,8 @@ import static com.linkedin.metadata.Constants.DATASET_ENTITY_NAME; import static com.linkedin.metadata.Constants.DATASET_PROPERTIES_ASPECT_NAME; -import com.fasterxml.jackson.databind.JsonNode; import com.linkedin.metadata.aspect.patch.PatchOperationType; import com.linkedin.metadata.aspect.patch.builder.subtypesupport.CustomPropertiesPatchBuilderSupport; -import java.util.List; import java.util.Map; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -116,12 +114,6 @@ public DatasetPropertiesPatchBuilder setCustomProperties(Map pro return this; } - @Override - protected List> getPathValues() { - pathValues.addAll(customPropertiesPatchBuilder.getSubPaths()); - return pathValues; - } - @Override protected String getAspectName() { return DATASET_PROPERTIES_ASPECT_NAME; diff --git a/entity-registry/src/main/java/com/linkedin/metadata/aspect/patch/builder/subtypesupport/IntermediatePatchBuilder.java b/entity-registry/src/main/java/com/linkedin/metadata/aspect/patch/builder/subtypesupport/IntermediatePatchBuilder.java index d891a6b9673da0..cd74818c24e191 100644 --- a/entity-registry/src/main/java/com/linkedin/metadata/aspect/patch/builder/subtypesupport/IntermediatePatchBuilder.java +++ b/entity-registry/src/main/java/com/linkedin/metadata/aspect/patch/builder/subtypesupport/IntermediatePatchBuilder.java @@ -1,9 +1,6 @@ package com.linkedin.metadata.aspect.patch.builder.subtypesupport; -import com.fasterxml.jackson.databind.JsonNode; import com.linkedin.metadata.aspect.patch.builder.AbstractMultiFieldPatchBuilder; -import java.util.List; -import org.apache.commons.lang3.tuple.ImmutableTriple; /** * Used for supporting intermediate subtypes when constructing a patch for an aspect that includes @@ -15,10 +12,4 @@ public interface IntermediatePatchBuilder> getSubPaths(); } diff --git a/entity-registry/src/test/java/com/linkedin/metadata/aspect/patch/builder/DataFlowInfoPatchBuilderTest.java b/entity-registry/src/test/java/com/linkedin/metadata/aspect/patch/builder/DataFlowInfoPatchBuilderTest.java new file mode 100644 index 00000000000000..612282b7c0238c --- /dev/null +++ b/entity-registry/src/test/java/com/linkedin/metadata/aspect/patch/builder/DataFlowInfoPatchBuilderTest.java @@ -0,0 +1,280 @@ +package com.linkedin.metadata.aspect.patch.builder; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertNull; +import static org.testng.Assert.assertTrue; + +import com.fasterxml.jackson.databind.JsonNode; +import com.linkedin.common.TimeStamp; +import com.linkedin.common.urn.Urn; +import java.net.URISyntaxException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.apache.commons.lang3.tuple.ImmutableTriple; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +public class DataFlowInfoPatchBuilderTest { + + private TestableDataFlowInfoPatchBuilder builder; + private static final String TEST_URN = "urn:li:dataFlow:(test,flow1,PROD)"; + + // Test helper class to expose protected method + private static class TestableDataFlowInfoPatchBuilder extends DataFlowInfoPatchBuilder { + public List> getTestPathValues() { + return getPathValues(); + } + } + + @BeforeMethod + public void setup() throws URISyntaxException { + builder = new TestableDataFlowInfoPatchBuilder(); + builder.urn(Urn.createFromString(TEST_URN)); + } + + @Test + public void testBuildDoesNotAffectPathValues() throws URISyntaxException { + String testName = "testFlow"; + String testDescription = "Test description"; + + builder.setName(testName).setDescription(testDescription).addCustomProperty("key1", "value1"); + + // First call build() + builder.build(); + + // Then verify we can still access pathValues and they're correct + List> pathValues = builder.getTestPathValues(); + assertNotNull(pathValues); + assertEquals(pathValues.size(), 3); + + // Verify the operations are still intact + assertEquals(pathValues.get(0).getLeft(), "add"); + assertEquals(pathValues.get(0).getMiddle(), "/name"); + assertEquals(pathValues.get(0).getRight().asText(), testName); + + assertEquals(pathValues.get(1).getLeft(), "add"); + assertEquals(pathValues.get(1).getMiddle(), "/description"); + assertEquals(pathValues.get(1).getRight().asText(), testDescription); + + assertEquals(pathValues.get(2).getLeft(), "add"); + assertTrue(pathValues.get(2).getMiddle().startsWith("/customProperties/")); + assertEquals(pathValues.get(2).getRight().asText(), "value1"); + + // Verify we can call build() again without issues + builder.build(); + + // And verify pathValues are still accessible and correct + pathValues = builder.getTestPathValues(); + assertNotNull(pathValues); + assertEquals(pathValues.size(), 3); + } + + @Test + public void testSetName() { + String testName = "testFlow"; + builder.setName(testName); + builder.build(); + + List> pathValues = builder.getTestPathValues(); + assertNotNull(pathValues); + assertEquals(pathValues.size(), 1); + + ImmutableTriple operation = pathValues.get(0); + assertEquals(operation.getLeft(), "add"); + assertEquals(operation.getMiddle(), "/name"); + assertEquals(operation.getRight().asText(), testName); + } + + @Test + public void testSetDescription() { + String testDescription = "Test description"; + builder.setDescription(testDescription); + builder.build(); + + List> pathValues = builder.getTestPathValues(); + assertNotNull(pathValues); + assertEquals(pathValues.size(), 1); + + ImmutableTriple operation = pathValues.get(0); + assertEquals(operation.getLeft(), "add"); + assertEquals(operation.getMiddle(), "/description"); + assertEquals(operation.getRight().asText(), testDescription); + } + + @Test + public void testSetDescriptionNull() { + builder.setDescription(null); + builder.build(); + + List> pathValues = builder.getTestPathValues(); + assertNotNull(pathValues); + assertEquals(pathValues.size(), 1); + + ImmutableTriple operation = pathValues.get(0); + assertEquals(operation.getLeft(), "remove"); + assertEquals(operation.getMiddle(), "/description"); + assertNull(operation.getRight()); + } + + @Test + public void testSetProject() { + String testProject = "testProject"; + builder.setProject(testProject); + builder.build(); + + List> pathValues = builder.getTestPathValues(); + assertNotNull(pathValues); + assertEquals(pathValues.size(), 1); + + ImmutableTriple operation = pathValues.get(0); + assertEquals(operation.getLeft(), "add"); + assertEquals(operation.getMiddle(), "/project"); + assertEquals(operation.getRight().asText(), testProject); + } + + @Test + public void testSetProjectNull() { + builder.setProject(null); + builder.build(); + + List> pathValues = builder.getTestPathValues(); + assertNotNull(pathValues); + assertEquals(pathValues.size(), 1); + + ImmutableTriple operation = pathValues.get(0); + assertEquals(operation.getLeft(), "remove"); + assertEquals(operation.getMiddle(), "/project"); + assertNull(operation.getRight()); + } + + @Test + public void testSetCreated() throws URISyntaxException { + long time = System.currentTimeMillis(); + String actor = "urn:li:corpuser:testUser"; + TimeStamp created = new TimeStamp(); + created.setTime(time); + created.setActor(Urn.createFromString(actor)); + + builder.setCreated(created); + builder.build(); + + List> pathValues = builder.getTestPathValues(); + assertNotNull(pathValues); + assertEquals(pathValues.size(), 1); + + ImmutableTriple operation = pathValues.get(0); + assertEquals(operation.getLeft(), "add"); + assertEquals(operation.getMiddle(), "/created"); + JsonNode createdNode = operation.getRight(); + assertTrue(createdNode.isObject()); + assertEquals(createdNode.get("time").asLong(), time); + assertEquals(createdNode.get("actor").asText(), actor); + } + + @Test + public void testSetCreatedNull() { + builder.setCreated(null); + builder.build(); + + List> pathValues = builder.getTestPathValues(); + assertNotNull(pathValues); + assertEquals(pathValues.size(), 1); + + ImmutableTriple operation = pathValues.get(0); + assertEquals(operation.getLeft(), "remove"); + assertEquals(operation.getMiddle(), "/created"); + assertNull(operation.getRight()); + } + + @Test + public void testSetLastModified() throws URISyntaxException { + long time = System.currentTimeMillis(); + String actor = "urn:li:corpuser:testUser"; + TimeStamp lastModified = new TimeStamp(); + lastModified.setTime(time); + lastModified.setActor(Urn.createFromString(actor)); + + builder.setLastModified(lastModified); + builder.build(); + + List> pathValues = builder.getTestPathValues(); + assertNotNull(pathValues); + assertEquals(pathValues.size(), 1); + + ImmutableTriple operation = pathValues.get(0); + assertEquals(operation.getLeft(), "add"); + assertEquals(operation.getMiddle(), "/lastModified"); + JsonNode lastModifiedNode = operation.getRight(); + assertTrue(lastModifiedNode.isObject()); + assertEquals(lastModifiedNode.get("time").asLong(), time); + assertEquals(lastModifiedNode.get("actor").asText(), actor); + } + + @Test + public void testSetLastModifiedNull() { + builder.setLastModified(null); + builder.build(); + + List> pathValues = builder.getTestPathValues(); + assertNotNull(pathValues); + assertEquals(pathValues.size(), 1); + + ImmutableTriple operation = pathValues.get(0); + assertEquals(operation.getLeft(), "remove"); + assertEquals(operation.getMiddle(), "/lastModified"); + assertNull(operation.getRight()); + } + + @Test + public void testAddCustomProperties() { + builder.addCustomProperty("key1", "value1").addCustomProperty("key2", "value2"); + builder.build(); + + List> pathValues = builder.getTestPathValues(); + assertNotNull(pathValues); + assertEquals(pathValues.size(), 2); + + pathValues.forEach( + operation -> { + assertEquals(operation.getLeft(), "add"); + assertTrue(operation.getMiddle().startsWith("/customProperties/")); + assertTrue(operation.getRight().isTextual()); + }); + } + + @Test + public void testRemoveCustomProperty() { + builder.removeCustomProperty("key1"); + builder.build(); + + List> pathValues = builder.getTestPathValues(); + assertNotNull(pathValues); + assertEquals(pathValues.size(), 1); + + ImmutableTriple operation = pathValues.get(0); + assertEquals(operation.getLeft(), "remove"); + assertEquals(operation.getMiddle(), "/customProperties/key1"); + assertNull(operation.getRight()); + } + + @Test + public void testSetCustomProperties() { + Map properties = new HashMap<>(); + properties.put("key1", "value1"); + properties.put("key2", "value2"); + + builder.setCustomProperties(properties); + builder.build(); + + List> pathValues = builder.getTestPathValues(); + assertNotNull(pathValues); + assertEquals(pathValues.size(), 1); + + ImmutableTriple operation = pathValues.get(0); + assertEquals(operation.getLeft(), "add"); + assertEquals(operation.getMiddle(), "/customProperties"); + assertTrue(operation.getRight().isObject()); + } +} diff --git a/entity-registry/src/test/java/com/linkedin/metadata/aspect/patch/builder/DataJobInputOutputPatchBuilderTest.java b/entity-registry/src/test/java/com/linkedin/metadata/aspect/patch/builder/DataJobInputOutputPatchBuilderTest.java new file mode 100644 index 00000000000000..dc141863e24438 --- /dev/null +++ b/entity-registry/src/test/java/com/linkedin/metadata/aspect/patch/builder/DataJobInputOutputPatchBuilderTest.java @@ -0,0 +1,237 @@ +package com.linkedin.metadata.aspect.patch.builder; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertNull; +import static org.testng.Assert.assertThrows; +import static org.testng.Assert.assertTrue; + +import com.fasterxml.jackson.databind.JsonNode; +import com.linkedin.common.Edge; +import com.linkedin.common.urn.DataJobUrn; +import com.linkedin.common.urn.DatasetUrn; +import com.linkedin.common.urn.Urn; +import com.linkedin.metadata.graph.LineageDirection; +import java.net.URISyntaxException; +import java.util.List; +import org.apache.commons.lang3.tuple.ImmutableTriple; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +public class DataJobInputOutputPatchBuilderTest { + + private TestableDataJobInputOutputPatchBuilder builder; + private static final String TEST_DATAJOB_URN = + "urn:li:dataJob:(urn:li:dataFlow:(test,flow1,PROD),job1)"; + private static final String TEST_DATASET_URN = + "urn:li:dataset:(urn:li:dataPlatform:hive,SampleTable,PROD)"; + private static final String TEST_DATASET_FIELD_URN = + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:hive,SampleTable,PROD),id)"; + + // Test helper class to expose protected method + private static class TestableDataJobInputOutputPatchBuilder + extends DataJobInputOutputPatchBuilder { + public List> getTestPathValues() { + return getPathValues(); + } + } + + @BeforeMethod + public void setup() throws URISyntaxException { + builder = new TestableDataJobInputOutputPatchBuilder(); + builder.urn(Urn.createFromString(TEST_DATAJOB_URN)); + } + + @Test + public void testBuildDoesNotAffectPathValues() throws URISyntaxException { + DataJobUrn dataJobUrn = DataJobUrn.createFromString(TEST_DATAJOB_URN); + DatasetUrn datasetUrn = DatasetUrn.createFromString(TEST_DATASET_URN); + + builder + .addInputDatajobEdge(dataJobUrn) + .addInputDatasetEdge(datasetUrn) + .addOutputDatasetEdge(datasetUrn); + + // First call build() + builder.build(); + + // Then verify we can still access pathValues and they're correct + List> pathValues = builder.getTestPathValues(); + assertNotNull(pathValues); + assertEquals(pathValues.size(), 3); + + // Verify we can call build() again without issues + builder.build(); + + // And verify pathValues are still accessible and correct + pathValues = builder.getTestPathValues(); + assertNotNull(pathValues); + assertEquals(pathValues.size(), 3); + } + + @Test + public void testAddInputDatajobEdge() throws URISyntaxException { + DataJobUrn dataJobUrn = DataJobUrn.createFromString(TEST_DATAJOB_URN); + builder.addInputDatajobEdge(dataJobUrn); + builder.build(); + + List> pathValues = builder.getTestPathValues(); + assertNotNull(pathValues); + assertEquals(pathValues.size(), 1); + + ImmutableTriple operation = pathValues.get(0); + assertEquals(operation.getLeft(), "add"); + assertTrue(operation.getMiddle().startsWith("/inputDatajobEdges/")); + assertTrue(operation.getRight().isObject()); + assertEquals(operation.getRight().get("destinationUrn").asText(), dataJobUrn.toString()); + } + + @Test + public void testRemoveInputDatajobEdge() throws URISyntaxException { + DataJobUrn dataJobUrn = DataJobUrn.createFromString(TEST_DATAJOB_URN); + builder.removeInputDatajobEdge(dataJobUrn); + builder.build(); + + List> pathValues = builder.getTestPathValues(); + assertNotNull(pathValues); + assertEquals(pathValues.size(), 1); + + ImmutableTriple operation = pathValues.get(0); + assertEquals(operation.getLeft(), "remove"); + assertTrue(operation.getMiddle().startsWith("/inputDatajobEdges/")); + assertNull(operation.getRight()); + } + + @Test + public void testAddInputDatasetEdge() throws URISyntaxException { + DatasetUrn datasetUrn = DatasetUrn.createFromString(TEST_DATASET_URN); + builder.addInputDatasetEdge(datasetUrn); + builder.build(); + + List> pathValues = builder.getTestPathValues(); + assertNotNull(pathValues); + assertEquals(pathValues.size(), 1); + + ImmutableTriple operation = pathValues.get(0); + assertEquals(operation.getLeft(), "add"); + assertTrue(operation.getMiddle().startsWith("/inputDatasetEdges/")); + assertTrue(operation.getRight().isObject()); + assertEquals(operation.getRight().get("destinationUrn").asText(), datasetUrn.toString()); + } + + @Test + public void testRemoveInputDatasetEdge() throws URISyntaxException { + DatasetUrn datasetUrn = DatasetUrn.createFromString(TEST_DATASET_URN); + builder.removeInputDatasetEdge(datasetUrn); + builder.build(); + + List> pathValues = builder.getTestPathValues(); + assertNotNull(pathValues); + assertEquals(pathValues.size(), 1); + + ImmutableTriple operation = pathValues.get(0); + assertEquals(operation.getLeft(), "remove"); + assertTrue(operation.getMiddle().startsWith("/inputDatasetEdges/")); + assertNull(operation.getRight()); + } + + @Test + public void testAddOutputDatasetEdge() throws URISyntaxException { + DatasetUrn datasetUrn = DatasetUrn.createFromString(TEST_DATASET_URN); + builder.addOutputDatasetEdge(datasetUrn); + builder.build(); + + List> pathValues = builder.getTestPathValues(); + assertNotNull(pathValues); + assertEquals(pathValues.size(), 1); + + ImmutableTriple operation = pathValues.get(0); + assertEquals(operation.getLeft(), "add"); + assertTrue(operation.getMiddle().startsWith("/outputDatasetEdges/")); + assertTrue(operation.getRight().isObject()); + assertEquals(operation.getRight().get("destinationUrn").asText(), datasetUrn.toString()); + } + + @Test + public void testAddInputDatasetField() throws URISyntaxException { + Urn fieldUrn = Urn.createFromString(TEST_DATASET_FIELD_URN); + builder.addInputDatasetField(fieldUrn); + builder.build(); + + List> pathValues = builder.getTestPathValues(); + assertNotNull(pathValues); + assertEquals(pathValues.size(), 1); + + ImmutableTriple operation = pathValues.get(0); + assertEquals(operation.getLeft(), "add"); + assertTrue(operation.getMiddle().startsWith("/inputDatasetFields/")); + assertTrue(operation.getRight().isTextual()); + assertEquals(operation.getRight().asText(), fieldUrn.toString()); + } + + @Test + public void testRemoveInputDatasetField() throws URISyntaxException { + Urn fieldUrn = Urn.createFromString(TEST_DATASET_FIELD_URN); + builder.removeInputDatasetField(fieldUrn); + builder.build(); + + List> pathValues = builder.getTestPathValues(); + assertNotNull(pathValues); + assertEquals(pathValues.size(), 1); + + ImmutableTriple operation = pathValues.get(0); + assertEquals(operation.getLeft(), "remove"); + assertTrue(operation.getMiddle().startsWith("/inputDatasetFields/")); + assertNull(operation.getRight()); + } + + @Test + public void testAddOutputDatasetField() throws URISyntaxException { + Urn fieldUrn = Urn.createFromString(TEST_DATASET_FIELD_URN); + builder.addOutputDatasetField(fieldUrn); + builder.build(); + + List> pathValues = builder.getTestPathValues(); + assertNotNull(pathValues); + assertEquals(pathValues.size(), 1); + + ImmutableTriple operation = pathValues.get(0); + assertEquals(operation.getLeft(), "add"); + assertTrue(operation.getMiddle().startsWith("/outputDatasetFields/")); + assertTrue(operation.getRight().isTextual()); + assertEquals(operation.getRight().asText(), fieldUrn.toString()); + } + + @Test + public void testAddEdgeWithDirection() throws URISyntaxException { + DatasetUrn datasetUrn = DatasetUrn.createFromString(TEST_DATASET_URN); + Edge edge = new Edge(); + edge.setDestinationUrn(datasetUrn); + + builder.addEdge(edge, LineageDirection.UPSTREAM); + builder.build(); + + List> pathValues = builder.getTestPathValues(); + assertNotNull(pathValues); + assertEquals(pathValues.size(), 1); + + ImmutableTriple operation = pathValues.get(0); + assertEquals(operation.getLeft(), "add"); + assertTrue(operation.getMiddle().startsWith("/inputDatasetEdges/")); + assertTrue(operation.getRight().isObject()); + assertEquals(operation.getRight().get("destinationUrn").asText(), datasetUrn.toString()); + } + + @Test + public void testInvalidEntityTypeThrowsException() throws URISyntaxException { + Urn invalidUrn = Urn.createFromString("urn:li:glossaryTerm:invalid"); + Edge edge = new Edge(); + edge.setDestinationUrn(invalidUrn); + + assertThrows( + IllegalArgumentException.class, + () -> { + builder.addEdge(edge, LineageDirection.UPSTREAM); + }); + } +} diff --git a/metadata-ingestion-modules/airflow-plugin/tests/integration/test_plugin.py b/metadata-ingestion-modules/airflow-plugin/tests/integration/test_plugin.py index 44efd94f834b15..3becf10703df6c 100644 --- a/metadata-ingestion-modules/airflow-plugin/tests/integration/test_plugin.py +++ b/metadata-ingestion-modules/airflow-plugin/tests/integration/test_plugin.py @@ -8,6 +8,7 @@ import random import signal import subprocess +import textwrap import time from typing import Any, Iterator, Sequence @@ -110,6 +111,48 @@ def _wait_for_dag_finish( raise NotReadyError(f"DAG has not finished yet: {dag_run['state']}") +def _dump_dag_logs(airflow_instance: AirflowInstance, dag_id: str) -> None: + # Get the dag run info + res = airflow_instance.session.get( + f"{airflow_instance.airflow_url}/api/v1/dags/{dag_id}/dagRuns", timeout=5 + ) + res.raise_for_status() + dag_run = res.json()["dag_runs"][0] + dag_run_id = dag_run["dag_run_id"] + + # List the tasks in the dag run + res = airflow_instance.session.get( + f"{airflow_instance.airflow_url}/api/v1/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances", + timeout=5, + ) + res.raise_for_status() + task_instances = res.json()["task_instances"] + + # Sort tasks by start_date to maintain execution order + task_instances.sort(key=lambda x: x["start_date"] or "") + + print(f"\nTask execution order for DAG {dag_id}:") + for task in task_instances: + task_id = task["task_id"] + state = task["state"] + try_number = task.get("try_number", 1) + + task_header = f"Task: {task_id} (State: {state}; Try: {try_number})" + + # Get logs for the task's latest try number + try: + res = airflow_instance.session.get( + f"{airflow_instance.airflow_url}/api/v1/dags/{dag_id}/dagRuns/{dag_run_id}" + f"/taskInstances/{task_id}/logs/{try_number}", + params={"full_content": "true"}, + timeout=5, + ) + res.raise_for_status() + print(f"\n=== {task_header} ===\n{textwrap.indent(res.text, ' ')}") + except Exception as e: + print(f"Failed to fetch logs for {task_header}: {e}") + + @contextlib.contextmanager def _run_airflow( tmp_path: pathlib.Path, @@ -377,6 +420,11 @@ def test_airflow_plugin( print("Sleeping for a few seconds to let the plugin finish...") time.sleep(10) + try: + _dump_dag_logs(airflow_instance, dag_id) + except Exception as e: + print(f"Failed to dump DAG logs: {e}") + if dag_id == DAG_TO_SKIP_INGESTION: # Verify that no MCPs were generated. assert not os.path.exists(airflow_instance.metadata_file) diff --git a/metadata-ingestion-modules/airflow-plugin/tox.ini b/metadata-ingestion-modules/airflow-plugin/tox.ini index 2e4596a24c2a6c..28c0b9532bcb8e 100644 --- a/metadata-ingestion-modules/airflow-plugin/tox.ini +++ b/metadata-ingestion-modules/airflow-plugin/tox.ini @@ -59,6 +59,6 @@ commands = [testenv:py310-airflow24] extras = dev,integration-tests,plugin-v2,test-airflow24 -[testenv:py310-airflow{26,27,28},py311-airflow{29,210}] +[testenv:py3{10,11}-airflow{26,27,28,29,210}] extras = dev,integration-tests,plugin-v2 diff --git a/metadata-ingestion/build.gradle b/metadata-ingestion/build.gradle index e832ac23e29fac..2c5d8e6c9646a8 100644 --- a/metadata-ingestion/build.gradle +++ b/metadata-ingestion/build.gradle @@ -28,15 +28,7 @@ task environmentSetup(type: Exec, dependsOn: checkPythonVersion) { "touch ${sentinel_file}" } -task runPreFlightScript(type: Exec, dependsOn: environmentSetup) { - def sentinel_file = ".preflight_sentinel" - outputs.file(sentinel_file) - commandLine 'bash', '-c', - "scripts/datahub_preflight.sh && " + - "touch ${sentinel_file}" -} - -task installPackageOnly(type: Exec, dependsOn: runPreFlightScript) { +task installPackageOnly(type: Exec, dependsOn: environmentSetup) { def sentinel_file = "${venv_name}/.build_install_package_only_sentinel" inputs.file file('setup.py') outputs.file(sentinel_file) diff --git a/metadata-ingestion/docs/sources/business-glossary/datahub-business-glossary.md b/metadata-ingestion/docs/sources/business-glossary/datahub-business-glossary.md index 3d2a0509492bd5..3433a853ea9b05 100644 --- a/metadata-ingestion/docs/sources/business-glossary/datahub-business-glossary.md +++ b/metadata-ingestion/docs/sources/business-glossary/datahub-business-glossary.md @@ -7,7 +7,7 @@ The business glossary source file should be a .yml file with the following top-l Example **Glossary**: ```yaml -version: 1 # the version of business glossary file config the config conforms to. Currently the only version released is `1`. +version: "1" # the version of business glossary file config the config conforms to. Currently the only version released is `1`. source: DataHub # the source format of the terms. Currently only supports `DataHub` owners: # owners contains two nested fields users: # (optional) a list of user IDs @@ -60,7 +60,7 @@ Example **GlossaryTerm**: - Shipping.CountryCode - Shipping.StreetAddress custom_properties: # (optional) a map of key/value pairs of arbitrary custom properties - - is_used_for_compliance_tracking: true + - is_used_for_compliance_tracking: "true" knowledge_links: # (optional) a list of **KnowledgeCard** related to this term. These appear as links on the glossary node's page - url: "https://en.wikipedia.org/wiki/Address" label: Wiki link @@ -73,7 +73,7 @@ To see how these all work together, check out this comprehensive example busines Example business glossary file ```yaml -version: 1 +version: "1" source: DataHub owners: users: @@ -89,15 +89,15 @@ nodes: - name: Sensitive description: Sensitive Data custom_properties: - is_confidential: false + is_confidential: "false" - name: Confidential description: Confidential Data custom_properties: - is_confidential: true + is_confidential: "true" - name: HighlyConfidential description: Highly Confidential Data custom_properties: - is_confidential: true + is_confidential: "true" domain: Marketing - name: PersonalInformation description: All terms related to personal information @@ -148,7 +148,7 @@ nodes: related_terms: - Housing.Kitchen.Cutlery custom_properties: - - is_used_for_compliance_tracking: true + - is_used_for_compliance_tracking: "true" knowledge_links: - url: "https://en.wikipedia.org/wiki/Address" label: Wiki link @@ -237,7 +237,7 @@ Source file linked [here](https://github.com/datahub-project/datahub/blob/master ## Generating custom IDs for your terms -IDs are normally inferred from the glossary term/node's name, see the `enable_auto_id` config. But, if you need a stable +IDs are normally inferred from the glossary term/node's name, see the `enable_auto_id` config. But, if you need a stable identifier, you can generate a custom ID for your term. It should be unique across the entire Glossary. Here's an example ID: @@ -247,5 +247,5 @@ A note of caution: once you select a custom ID, it cannot be easily changed. ## Compatibility -Compatible with version 1 of business glossary format. -The source will be evolved as we publish newer versions of this format. \ No newline at end of file +Compatible with version 1 of business glossary format. +The source will be evolved as we publish newer versions of this format. diff --git a/metadata-ingestion/docs/sources/dremio/dremio_recipe.yml b/metadata-ingestion/docs/sources/dremio/dremio_recipe.yml index 9dcd4f8b337d16..d18d19da2de84b 100644 --- a/metadata-ingestion/docs/sources/dremio/dremio_recipe.yml +++ b/metadata-ingestion/docs/sources/dremio/dremio_recipe.yml @@ -20,6 +20,8 @@ source: include_query_lineage: True + ingest_owner: true + #Optional source_mappings: - platform: s3 diff --git a/metadata-ingestion/docs/sources/neo4j/neo4j.md b/metadata-ingestion/docs/sources/neo4j/neo4j.md new file mode 100644 index 00000000000000..d4dab2c6c7e1f2 --- /dev/null +++ b/metadata-ingestion/docs/sources/neo4j/neo4j.md @@ -0,0 +1,20 @@ +## Integration Details + + + +Neo4j metadata will be ingested into DataHub using +`CALL apoc.meta.schema() YIELD value UNWIND keys(value) AS key RETURN key, value[key] AS value;` +The data that is returned will be parsed +and will be displayed as Nodes and Relationships in DataHub. Each object will be tagged with describing what kind of DataHub +object it is. The defaults are 'Node' and 'Relationship'. These tag values can be overwritten in the recipe. + + + +## Metadata Ingestion Quickstart + +### Prerequisites + +In order to ingest metadata from Neo4j, you will need: + +* Neo4j instance with APOC installed + diff --git a/metadata-ingestion/docs/sources/neo4j/neo4j_recipe.yml b/metadata-ingestion/docs/sources/neo4j/neo4j_recipe.yml new file mode 100644 index 00000000000000..463d65e7ba323b --- /dev/null +++ b/metadata-ingestion/docs/sources/neo4j/neo4j_recipe.yml @@ -0,0 +1,12 @@ +source: + type: 'neo4j' + config: + uri: 'neo4j+ssc://host:7687' + username: 'neo4j' + password: 'password' + env: 'PROD' + +sink: + type: "datahub-rest" + config: + server: 'http://localhost:8080' \ No newline at end of file diff --git a/metadata-ingestion/examples/bootstrap_data/banking_business_glossary.yaml b/metadata-ingestion/examples/bootstrap_data/banking_business_glossary.yaml index d0fea81748da57..a1adec58b7b5ea 100644 --- a/metadata-ingestion/examples/bootstrap_data/banking_business_glossary.yaml +++ b/metadata-ingestion/examples/bootstrap_data/banking_business_glossary.yaml @@ -1,4 +1,4 @@ -version: 1 +version: "1" source: DataHub owners: users: @@ -68,4 +68,4 @@ nodes: - name: Auto Loan description: "A type of loan used to finance the purchase of a vehicle, with the vehicle serving as collateral for the loan." - name: Interest Rate - description: "The rate at which interest is charged on a loan or paid on an investment, expressed as a percentage of the principal amount." \ No newline at end of file + description: "The rate at which interest is charged on a loan or paid on an investment, expressed as a percentage of the principal amount." diff --git a/metadata-ingestion/examples/bootstrap_data/business_glossary.yml b/metadata-ingestion/examples/bootstrap_data/business_glossary.yml index 327246863b0ab0..20d1011b966893 100644 --- a/metadata-ingestion/examples/bootstrap_data/business_glossary.yml +++ b/metadata-ingestion/examples/bootstrap_data/business_glossary.yml @@ -1,4 +1,4 @@ -version: 1 +version: "1" source: DataHub owners: users: @@ -11,20 +11,20 @@ nodes: - label: Wiki link for classification url: "https://en.wikipedia.org/wiki/Classification" custom_properties: - is_confidential: true + is_confidential: "true" terms: - name: Sensitive description: Sensitive Data custom_properties: - is_confidential: false + is_confidential: "false" - name: Confidential description: Confidential Data custom_properties: - is_confidential: true + is_confidential: "true" - name: HighlyConfidential description: Highly Confidential Data custom_properties: - is_confidential: true + is_confidential: "true" domain: Marketing - name: PersonalInformation description: All terms related to personal information @@ -72,7 +72,7 @@ nodes: - Shipping.CountryCode - Shipping.StreetAddress custom_properties: - is_used_for_compliance_tracking: true + is_used_for_compliance_tracking: "true" knowledge_links: - url: "https://en.wikipedia.org/wiki/Address" label: Wiki link diff --git a/metadata-ingestion/scripts/datahub_preflight.sh b/metadata-ingestion/scripts/datahub_preflight.sh deleted file mode 100755 index 9676964f4d49d1..00000000000000 --- a/metadata-ingestion/scripts/datahub_preflight.sh +++ /dev/null @@ -1,108 +0,0 @@ -#!/bin/bash -e - -#From https://stackoverflow.com/questions/4023830/how-to-compare-two-strings-in-dot-separated-version-format-in-bash -verlte() { - [ "$1" == "$(echo -e "$1\n$2" | sort -V | head -n1)" ] -} - -brew_install() { - package=${1} - required_version=${2} - printf '\nπŸ”Ž Checking if %s installed\n' "${package}" - version=$(brew list --version|grep "$1"|awk '{ print $2 }') - - if [ -n "${version}" ]; then - if [ -n "$2" ] && ! verlte "${required_version}" "${version}"; then - printf 'πŸ”½ %s is installed but its version %s is lower than the required %s\n' "${package}" "${version}" "${required_version}. Updating version..." - brew update && brew upgrade "$1" && printf 'βœ… %s is installed\n' "${package}" - else - printf 'βœ… %s is already installed\n' "${package} with version ${version}" - fi - else - brew install "$1" && printf 'βœ… %s is installed\n' "${package}" - fi -} - -arm64_darwin_preflight() { - printf "✨ Creating/activating Virtual Environment\n" - python3 -m venv venv - source venv/bin/activate - - printf "πŸ”Ž Checking if Scipy installed\n" - if pip list | grep -F scipy; then - printf "βœ… Scipy already installed\n" - else - printf "Scipy not installed\n" - printf "β›… Installing prerequisities for scipy" - brew install openblas - OPENBLAS="$(brew --prefix openblas)" - export OPENBLAS - ##preinstall numpy and pythran from source - pip3 uninstall -y numpy pythran - pip3 install cython pybind11 - pip3 install --no-use-pep517 numpy - pip3 install pythran - pip3 install --no-use-pep517 scipy - fi - - brew_install "openssl@1.1" - brew install "postgresql@14" - - # postgresql installs libs in a strange way - # we first symlink /opt/postgresql@14 to /opt/postgresql - if [ ! -z $(brew --prefix)/opt/postgresql ]; then - printf "✨ Symlinking postgresql@14 to postgresql\n" - ln -sf $(brew --prefix postgresql@14) $(brew --prefix)/opt/postgresql - fi - # we then symlink all libs under /opt/postgresql@14/lib/postgresql@14 to /opt/postgresql@14/lib - if [ ! -z $(brew --prefix postgresql@14)/lib/postgresql@14 ]; then - printf "✨ Patching up libs in $(brew --prefix postgresql@14)/lib/postgresql@14)\n" - ln -sf $(brew --prefix postgresql@14)/lib/postgresql@14/* $(brew --prefix postgresql@14)/lib/ - fi - - printf "\e[38;2;0;255;0mβœ… Done\e[38;2;255;255;255m\n" - - printf "✨ Setting up environment variable:\n" - GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1 - export GRPC_PYTHON_BUILD_SYSTEM_OPENSSL - GRPC_PYTHON_BUILD_SYSTEM_ZLIB=1 - export GRPC_PYTHON_BUILD_SYSTEM_ZLIB - CPPFLAGS="-I$(brew --prefix openssl@1.1)/include" - export CPPFLAGS - LDFLAGS="-L$(brew --prefix openssl@1.1)/lib" - export LDFLAGS - -cat << EOF - export GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1 - export GRPC_PYTHON_BUILD_SYSTEM_ZLIB=1 - export CPPFLAGS="-I$(brew --prefix openssl@1.1)/include" - export LDFLAGS="-L$(brew --prefix openssl@1.1)/lib -L$(brew --prefix postgresql@14)/lib/postgresql@14" - -EOF - - if pip list | grep -F confluent-kafka; then - printf "βœ… confluent-kafka already installed\n" - else - pip3 install confluent-kafka - fi - - printf "✨ Setting up prerequisities\n" - # none for now, since jq was removed - - printf "\e[38;2;0;255;0mβœ… Done\e[38;2;255;255;255m\n" -} - - -printf "πŸ”Ž Checking if current directory is metadata-ingestion folder\n" -if [ "$(basename "$(pwd)")" != "metadata-ingestion" ]; then - printf "πŸ’₯ You should run this script in Datahub\'s metadata-ingestion folder but your folder is %s\n" "$(pwd)" - exit 123 -fi -printf 'βœ… Current folder is metadata-ingestion (%s) folder\n' "$(pwd)" -if [[ $(uname -m) == 'arm64' && $(uname) == 'Darwin' ]]; then - printf "πŸ‘Ÿ Running preflight for m1 mac\n" - arm64_darwin_preflight -fi - - -printf "\n\e[38;2;0;255;0mβœ… Preflight was successful\e[38;2;255;255;255m\n" diff --git a/metadata-ingestion/setup.py b/metadata-ingestion/setup.py index d7e056b31370df..c6d55fb5bcc56e 100644 --- a/metadata-ingestion/setup.py +++ b/metadata-ingestion/setup.py @@ -525,6 +525,7 @@ "qlik-sense": sqlglot_lib | {"requests", "websocket-client"}, "sigma": sqlglot_lib | {"requests"}, "sac": sac, + "neo4j": {"pandas", "neo4j"}, } # This is mainly used to exclude plugins from the Docker image. @@ -673,6 +674,7 @@ "sigma", "sac", "cassandra", + "neo4j", ] if plugin for dependency in plugins[plugin] @@ -792,6 +794,7 @@ "sigma = datahub.ingestion.source.sigma.sigma:SigmaSource", "sac = datahub.ingestion.source.sac.sac:SACSource", "cassandra = datahub.ingestion.source.cassandra.cassandra:CassandraSource", + "neo4j = datahub.ingestion.source.neo4j.neo4j_source:Neo4jSource", ], "datahub.ingestion.transformer.plugins": [ "pattern_cleanup_ownership = datahub.ingestion.transformer.pattern_cleanup_ownership:PatternCleanUpOwnership", diff --git a/metadata-ingestion/src/datahub/api/entities/structuredproperties/structuredproperties.py b/metadata-ingestion/src/datahub/api/entities/structuredproperties/structuredproperties.py index 56e02e4329055a..181c70adc640a6 100644 --- a/metadata-ingestion/src/datahub/api/entities/structuredproperties/structuredproperties.py +++ b/metadata-ingestion/src/datahub/api/entities/structuredproperties/structuredproperties.py @@ -121,7 +121,7 @@ def fqn(self) -> str: return ( self.qualified_name or self.id - or Urn.create_from_string(self.urn).get_entity_id()[0] + or Urn.from_string(self.urn).get_entity_id()[0] ) @validator("urn", pre=True, always=True) diff --git a/metadata-ingestion/src/datahub/cli/put_cli.py b/metadata-ingestion/src/datahub/cli/put_cli.py index 0a40a9f4ccf92d..d3a6fb5caaf197 100644 --- a/metadata-ingestion/src/datahub/cli/put_cli.py +++ b/metadata-ingestion/src/datahub/cli/put_cli.py @@ -105,7 +105,7 @@ def platform( """ if name.startswith(f"urn:li:{DataPlatformUrn.ENTITY_TYPE}"): - platform_urn = DataPlatformUrn.create_from_string(name) + platform_urn = DataPlatformUrn.from_string(name) platform_name = platform_urn.get_entity_id_as_string() else: platform_name = name.lower() diff --git a/metadata-ingestion/src/datahub/cli/specific/dataproduct_cli.py b/metadata-ingestion/src/datahub/cli/specific/dataproduct_cli.py index 8ec4d3ad249376..857a6fbb4e18e5 100644 --- a/metadata-ingestion/src/datahub/cli/specific/dataproduct_cli.py +++ b/metadata-ingestion/src/datahub/cli/specific/dataproduct_cli.py @@ -45,7 +45,7 @@ def _get_owner_urn(maybe_urn: str) -> str: def _abort_if_non_existent_urn(graph: DataHubGraph, urn: str, operation: str) -> None: try: - parsed_urn: Urn = Urn.create_from_string(urn) + parsed_urn: Urn = Urn.from_string(urn) entity_type = parsed_urn.get_type() except Exception: click.secho(f"Provided urn {urn} does not seem valid", fg="red") diff --git a/metadata-ingestion/src/datahub/emitter/mcp_patch_builder.py b/metadata-ingestion/src/datahub/emitter/mcp_patch_builder.py index 37903995394379..779b42e1e1ee99 100644 --- a/metadata-ingestion/src/datahub/emitter/mcp_patch_builder.py +++ b/metadata-ingestion/src/datahub/emitter/mcp_patch_builder.py @@ -1,4 +1,5 @@ import json +import time from collections import defaultdict from dataclasses import dataclass from typing import Any, Dict, Iterable, List, Optional, Sequence, Union @@ -6,12 +7,15 @@ from datahub.emitter.aspect import JSON_PATCH_CONTENT_TYPE from datahub.emitter.serialization_helper import pre_json_transform from datahub.metadata.schema_classes import ( + AuditStampClass, ChangeTypeClass, + EdgeClass, GenericAspectClass, KafkaAuditHeaderClass, MetadataChangeProposalClass, SystemMetadataClass, ) +from datahub.metadata.urns import Urn from datahub.utilities.urns.urn import guess_entity_type @@ -89,3 +93,42 @@ def build(self) -> Iterable[MetadataChangeProposalClass]: ) for aspect_name, patches in self.patches.items() ] + + @classmethod + def _mint_auditstamp(cls, message: Optional[str] = None) -> AuditStampClass: + """ + Creates an AuditStampClass instance with the current timestamp and other default values. + + Args: + message: The message associated with the audit stamp (optional). + + Returns: + An instance of AuditStampClass. + """ + return AuditStampClass( + time=int(time.time() * 1000.0), + actor="urn:li:corpuser:datahub", + message=message, + ) + + @classmethod + def _ensure_urn_type( + cls, entity_type: str, edges: List[EdgeClass], context: str + ) -> None: + """ + Ensures that the destination URNs in the given edges have the specified entity type. + + Args: + entity_type: The entity type to check against. + edges: A list of Edge objects. + context: The context or description of the operation. + + Raises: + ValueError: If any of the destination URNs is not of the specified entity type. + """ + for e in edges: + urn = Urn.from_string(e.destinationUrn) + if not urn.entity_type == entity_type: + raise ValueError( + f"{context}: {e.destinationUrn} is not of type {entity_type}" + ) diff --git a/metadata-ingestion/src/datahub/ingestion/source/bigquery_v2/bigquery_audit.py b/metadata-ingestion/src/datahub/ingestion/source/bigquery_v2/bigquery_audit.py index 319c838d2658ad..42f82704c81b99 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/bigquery_v2/bigquery_audit.py +++ b/metadata-ingestion/src/datahub/ingestion/source/bigquery_v2/bigquery_audit.py @@ -190,7 +190,7 @@ def from_string_name(cls, ref: str) -> "BigQueryTableRef": @classmethod def from_urn(cls, urn: str) -> "BigQueryTableRef": """Raises: ValueError if urn is not a valid BigQuery table URN.""" - dataset_urn = DatasetUrn.create_from_string(urn) + dataset_urn = DatasetUrn.from_string(urn) split = dataset_urn.name.rsplit(".", 3) if len(split) == 3: project, dataset, table = split diff --git a/metadata-ingestion/src/datahub/ingestion/source/common/subtypes.py b/metadata-ingestion/src/datahub/ingestion/source/common/subtypes.py index 9fbb15500a863c..a5eecf198a9b49 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/common/subtypes.py +++ b/metadata-ingestion/src/datahub/ingestion/source/common/subtypes.py @@ -22,6 +22,8 @@ class DatasetSubTypes(StrEnum): SAC_MODEL = "Model" SAC_IMPORT_DATA_MODEL = "Import Data Model" SAC_LIVE_DATA_MODEL = "Live Data Model" + NEO4J_NODE = "Neo4j Node" + NEO4J_RELATIONSHIP = "Neo4j Relationship" # TODO: Create separate entity... NOTEBOOK = "Notebook" diff --git a/metadata-ingestion/src/datahub/ingestion/source/csv_enricher.py b/metadata-ingestion/src/datahub/ingestion/source/csv_enricher.py index e4829f8713cf76..42e025073b534e 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/csv_enricher.py +++ b/metadata-ingestion/src/datahub/ingestion/source/csv_enricher.py @@ -653,7 +653,7 @@ def get_workunits_internal(self) -> Iterable[MetadataWorkUnit]: is_resource_row: bool = not row["subresource"] entity_urn = row["resource"] - entity_type = Urn.create_from_string(row["resource"]).get_type() + entity_type = Urn.from_string(row["resource"]).get_type() term_associations: List[ GlossaryTermAssociationClass diff --git a/metadata-ingestion/src/datahub/ingestion/source/dremio/dremio_api.py b/metadata-ingestion/src/datahub/ingestion/source/dremio/dremio_api.py index 7b9ccb52acbef4..7f4e0f520b7a5e 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/dremio/dremio_api.py +++ b/metadata-ingestion/src/datahub/ingestion/source/dremio/dremio_api.py @@ -774,3 +774,14 @@ def process_source_and_containers(source): containers.extend(future.result()) return containers + + def get_context_for_vds(self, resource_id: str) -> str: + context_array = self.get( + url=f"/catalog/{resource_id}", + ).get("sqlContext") + if context_array: + return ".".join( + f'"{part}"' if "." in part else f"{part}" for part in context_array + ) + else: + return "" diff --git a/metadata-ingestion/src/datahub/ingestion/source/dremio/dremio_aspects.py b/metadata-ingestion/src/datahub/ingestion/source/dremio/dremio_aspects.py index b29fc91a25e74c..d9d85edbf4f7a0 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/dremio/dremio_aspects.py +++ b/metadata-ingestion/src/datahub/ingestion/source/dremio/dremio_aspects.py @@ -142,6 +142,7 @@ def __init__( platform: str, ui_url: str, env: str, + ingest_owner: bool, domain: Optional[str] = None, platform_instance: Optional[str] = None, ): @@ -150,6 +151,7 @@ def __init__( self.env = env self.domain = domain self.ui_url = ui_url + self.ingest_owner = ingest_owner def get_container_key( self, name: Optional[str], path: Optional[List[str]] @@ -426,21 +428,23 @@ def _create_external_url(self, dataset: DremioDataset) -> str: return f'{self.ui_url}/{container_type}/{dataset_url_path}"{dataset.resource_name}"' def _create_ownership(self, dataset: DremioDataset) -> Optional[OwnershipClass]: - if not dataset.owner: - return None - owner = ( - make_user_urn(dataset.owner) - if dataset.owner_type == "USER" - else make_group_urn(dataset.owner) - ) - return OwnershipClass( - owners=[ - OwnerClass( - owner=owner, - type=OwnershipTypeClass.TECHNICAL_OWNER, - ) - ] - ) + if self.ingest_owner and dataset.owner: + owner_urn = ( + make_user_urn(dataset.owner) + if dataset.owner_type == "USER" + else make_group_urn(dataset.owner) + ) + ownership: OwnershipClass = OwnershipClass( + owners=[ + OwnerClass( + owner=owner_urn, + type=OwnershipTypeClass.TECHNICAL_OWNER, + ) + ] + ) + return ownership + + return None def _create_glossary_terms(self, entity: DremioDataset) -> GlossaryTermsClass: return GlossaryTermsClass( diff --git a/metadata-ingestion/src/datahub/ingestion/source/dremio/dremio_config.py b/metadata-ingestion/src/datahub/ingestion/source/dremio/dremio_config.py index d966d575c03320..b3f2107a1dfaa7 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/dremio/dremio_config.py +++ b/metadata-ingestion/src/datahub/ingestion/source/dremio/dremio_config.py @@ -174,3 +174,8 @@ def is_profiling_enabled(self) -> bool: default=False, description="Whether to include query-based lineage information.", ) + + ingest_owner: bool = Field( + default=True, + description="Ingest Owner from source. This will override Owner info entered from UI", + ) diff --git a/metadata-ingestion/src/datahub/ingestion/source/dremio/dremio_entities.py b/metadata-ingestion/src/datahub/ingestion/source/dremio/dremio_entities.py index 16774c2e4a816f..b80d7b8e0f9123 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/dremio/dremio_entities.py +++ b/metadata-ingestion/src/datahub/ingestion/source/dremio/dremio_entities.py @@ -200,6 +200,7 @@ class DremioDataset: columns: List[DremioDatasetColumn] sql_definition: Optional[str] dataset_type: DremioDatasetType + default_schema: Optional[str] owner: Optional[str] owner_type: Optional[str] created: str @@ -235,6 +236,9 @@ def __init__( if self.sql_definition: self.dataset_type = DremioDatasetType.VIEW + self.default_schema = api_operations.get_context_for_vds( + resource_id=self.resource_id + ) else: self.dataset_type = DremioDatasetType.TABLE diff --git a/metadata-ingestion/src/datahub/ingestion/source/dremio/dremio_source.py b/metadata-ingestion/src/datahub/ingestion/source/dremio/dremio_source.py index 5b96845ec04961..319290d25169af 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/dremio/dremio_source.py +++ b/metadata-ingestion/src/datahub/ingestion/source/dremio/dremio_source.py @@ -97,6 +97,7 @@ class DremioSource(StatefulIngestionSourceBase): - Ownership and Glossary Terms: - Metadata related to ownership of datasets, extracted from Dremio’s ownership model. - Glossary terms and business metadata associated with datasets, providing additional context to the data. + - Note: Ownership information will only be available for the Cloud and Enterprise editions, it will not be available for the Community edition. - Optional SQL Profiling (if enabled): - Table, row, and column statistics can be profiled and ingested via optional SQL queries. @@ -123,6 +124,7 @@ def __init__(self, config: DremioSourceConfig, ctx: PipelineContext): self.dremio_aspects = DremioAspects( platform=self.get_platform(), domain=self.config.domain, + ingest_owner=self.config.ingest_owner, platform_instance=self.config.platform_instance, env=self.config.env, ui_url=dremio_api.ui_url, @@ -394,10 +396,12 @@ def process_dataset( ): yield dremio_mcp # Check if the emitted aspect is SchemaMetadataClass - if isinstance(dremio_mcp.metadata, SchemaMetadataClass): + if isinstance( + dremio_mcp.metadata, MetadataChangeProposalWrapper + ) and isinstance(dremio_mcp.metadata.aspect, SchemaMetadataClass): self.sql_parsing_aggregator.register_schema( urn=dataset_urn, - schema=dremio_mcp.metadata, + schema=dremio_mcp.metadata.aspect, ) if dataset_info.dataset_type == DremioDatasetType.VIEW: @@ -415,6 +419,7 @@ def process_dataset( view_urn=dataset_urn, view_definition=dataset_info.sql_definition, default_db=self.default_db, + default_schema=dataset_info.default_schema, ) elif dataset_info.dataset_type == DremioDatasetType.TABLE: diff --git a/metadata-ingestion/src/datahub/ingestion/source/elastic_search.py b/metadata-ingestion/src/datahub/ingestion/source/elastic_search.py index aa5913f5dc66b1..99aa5f54f6a576 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/elastic_search.py +++ b/metadata-ingestion/src/datahub/ingestion/source/elastic_search.py @@ -227,7 +227,7 @@ def collapse_name(name: str, collapse_urns: CollapseUrns) -> str: def collapse_urn(urn: str, collapse_urns: CollapseUrns) -> str: if len(collapse_urns.urns_suffix_regex) == 0: return urn - urn_obj = DatasetUrn.create_from_string(urn) + urn_obj = DatasetUrn.from_string(urn) name = collapse_name(name=urn_obj.get_dataset_name(), collapse_urns=collapse_urns) data_platform_urn = urn_obj.get_data_platform_urn() return str( diff --git a/metadata-ingestion/src/datahub/ingestion/source/gc/dataprocess_cleanup.py b/metadata-ingestion/src/datahub/ingestion/source/gc/dataprocess_cleanup.py index 0f35e1a67fede7..ca67cd6daa045b 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/gc/dataprocess_cleanup.py +++ b/metadata-ingestion/src/datahub/ingestion/source/gc/dataprocess_cleanup.py @@ -277,7 +277,12 @@ def delete_dpi_from_datajobs(self, job: DataJobEntity) -> None: assert self.ctx.graph dpis = self.fetch_dpis(job.urn, self.config.batch_size) - dpis.sort(key=lambda x: x["created"]["time"], reverse=True) + dpis.sort( + key=lambda x: x["created"]["time"] + if x["created"] and x["created"]["time"] + else 0, + reverse=True, + ) with ThreadPoolExecutor(max_workers=self.config.max_workers) as executor: if self.config.keep_last_n: diff --git a/metadata-ingestion/src/datahub/ingestion/source/gc/soft_deleted_entity_cleanup.py b/metadata-ingestion/src/datahub/ingestion/source/gc/soft_deleted_entity_cleanup.py index 7ec7bb7e589d63..3b367cdea58134 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/gc/soft_deleted_entity_cleanup.py +++ b/metadata-ingestion/src/datahub/ingestion/source/gc/soft_deleted_entity_cleanup.py @@ -104,7 +104,7 @@ def __init__( def delete_entity(self, urn: str) -> None: assert self.ctx.graph - entity_urn = Urn.create_from_string(urn) + entity_urn = Urn.from_string(urn) self.report.num_soft_deleted_entity_removed += 1 self.report.num_soft_deleted_entity_removed_by_type[entity_urn.entity_type] = ( self.report.num_soft_deleted_entity_removed_by_type.get( diff --git a/metadata-ingestion/src/datahub/ingestion/source/ge_data_profiler.py b/metadata-ingestion/src/datahub/ingestion/source/ge_data_profiler.py index f7d783cd3dec0b..c2c43a0e805b24 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/ge_data_profiler.py +++ b/metadata-ingestion/src/datahub/ingestion/source/ge_data_profiler.py @@ -57,7 +57,11 @@ convert_to_cardinality, ) from datahub.ingestion.source.sql.sql_report import SQLSourceReport -from datahub.metadata.com.linkedin.pegasus2avro.schema import EditableSchemaMetadata +from datahub.ingestion.source.sql.sql_types import resolve_sql_type +from datahub.metadata.com.linkedin.pegasus2avro.schema import ( + EditableSchemaMetadata, + NumberType, +) from datahub.metadata.schema_classes import ( DatasetFieldProfileClass, DatasetProfileClass, @@ -361,6 +365,8 @@ class _SingleDatasetProfiler(BasicDatasetProfilerBase): platform: str env: str + column_types: Dict[str, str] = dataclasses.field(default_factory=dict) + def _get_columns_to_profile(self) -> List[str]: if not self.config.any_field_level_metrics_enabled(): return [] @@ -374,6 +380,7 @@ def _get_columns_to_profile(self) -> List[str]: for col_dict in self.dataset.columns: col = col_dict["name"] + self.column_types[col] = str(col_dict["type"]) # We expect the allow/deny patterns to specify '.' if not self.config._allow_deny_patterns.allowed( f"{self.dataset_name}.{col}" @@ -430,6 +437,21 @@ def _get_column_type(self, column_spec: _SingleColumnSpec, column: str) -> None: self.dataset, column ) + if column_spec.type_ == ProfilerDataType.UNKNOWN: + try: + datahub_field_type = resolve_sql_type( + self.column_types[column], self.dataset.engine.dialect.name.lower() + ) + except Exception as e: + logger.debug( + f"Error resolving sql type {self.column_types[column]}: {e}" + ) + datahub_field_type = None + if datahub_field_type is None: + return + if isinstance(datahub_field_type, NumberType): + column_spec.type_ = ProfilerDataType.NUMERIC + @_run_with_query_combiner def _get_column_cardinality( self, column_spec: _SingleColumnSpec, column: str diff --git a/metadata-ingestion/src/datahub/ingestion/source/neo4j/__init__.py b/metadata-ingestion/src/datahub/ingestion/source/neo4j/__init__.py new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/metadata-ingestion/src/datahub/ingestion/source/neo4j/neo4j_source.py b/metadata-ingestion/src/datahub/ingestion/source/neo4j/neo4j_source.py new file mode 100644 index 00000000000000..2c9107b967e4f8 --- /dev/null +++ b/metadata-ingestion/src/datahub/ingestion/source/neo4j/neo4j_source.py @@ -0,0 +1,331 @@ +import logging +import time +from dataclasses import dataclass +from typing import Any, Dict, Iterable, List, Optional, Type, Union + +import pandas as pd +from neo4j import GraphDatabase +from pydantic.fields import Field + +from datahub.configuration.source_common import EnvConfigMixin +from datahub.emitter.mce_builder import make_data_platform_urn, make_dataset_urn +from datahub.emitter.mcp import MetadataChangeProposalWrapper +from datahub.ingestion.api.common import PipelineContext +from datahub.ingestion.api.decorators import ( + SupportStatus, + config_class, + platform_name, + support_status, +) +from datahub.ingestion.api.source import Source, SourceReport +from datahub.ingestion.api.workunit import MetadataWorkUnit +from datahub.ingestion.source.common.subtypes import DatasetSubTypes +from datahub.metadata.com.linkedin.pegasus2avro.schema import SchemaFieldDataType +from datahub.metadata.schema_classes import ( + AuditStampClass, + BooleanTypeClass, + DatasetPropertiesClass, + DateTypeClass, + NullTypeClass, + NumberTypeClass, + OtherSchemaClass, + SchemaFieldClass, + SchemaMetadataClass, + StringTypeClass, + SubTypesClass, + UnionTypeClass, +) + +log = logging.getLogger(__name__) +logging.basicConfig(level=logging.INFO) + +_type_mapping: Dict[Union[Type, str], Type] = { + "list": UnionTypeClass, + "boolean": BooleanTypeClass, + "integer": NumberTypeClass, + "local_date_time": DateTypeClass, + "float": NumberTypeClass, + "string": StringTypeClass, + "date": DateTypeClass, + "node": StringTypeClass, + "relationship": StringTypeClass, +} + + +class Neo4jConfig(EnvConfigMixin): + username: str = Field(description="Neo4j Username") + password: str = Field(description="Neo4j Password") + uri: str = Field(description="The URI for the Neo4j server") + env: str = Field(description="Neo4j env") + + +@dataclass +class Neo4jSourceReport(SourceReport): + obj_failures: int = 0 + obj_created: int = 0 + + +@platform_name("Neo4j", id="neo4j") +@config_class(Neo4jConfig) +@support_status(SupportStatus.CERTIFIED) +class Neo4jSource(Source): + NODE = "node" + RELATIONSHIP = "relationship" + PLATFORM = "neo4j" + + def __init__(self, ctx: PipelineContext, config: Neo4jConfig): + self.ctx = ctx + self.config = config + self.report = Neo4jSourceReport() + + @classmethod + def create(cls, config_dict, ctx): + config = Neo4jConfig.parse_obj(config_dict) + return cls(ctx, config) + + def get_field_type(self, attribute_type: Union[type, str]) -> SchemaFieldDataType: + type_class: type = _type_mapping.get(attribute_type, NullTypeClass) + return SchemaFieldDataType(type=type_class()) + + def get_schema_field_class( + self, col_name: str, col_type: str, **kwargs: Any + ) -> SchemaFieldClass: + if kwargs["obj_type"] == self.NODE and col_type == self.RELATIONSHIP: + col_type = self.NODE + else: + col_type = col_type + return SchemaFieldClass( + fieldPath=col_name, + type=self.get_field_type(col_type), + nativeDataType=col_type, + description=col_type.upper() + if col_type in (self.NODE, self.RELATIONSHIP) + else col_type, + lastModified=AuditStampClass( + time=round(time.time() * 1000), actor="urn:li:corpuser:ingestion" + ), + ) + + def add_properties( + self, + dataset: str, + description: Optional[str] = None, + custom_properties: Optional[Dict[str, str]] = None, + ) -> MetadataChangeProposalWrapper: + dataset_properties = DatasetPropertiesClass( + description=description, + customProperties=custom_properties, + ) + return MetadataChangeProposalWrapper( + entityUrn=make_dataset_urn( + platform=self.PLATFORM, name=dataset, env=self.config.env + ), + aspect=dataset_properties, + ) + + def generate_neo4j_object( + self, dataset: str, columns: list, obj_type: Optional[str] = None + ) -> MetadataChangeProposalWrapper: + try: + fields = [ + self.get_schema_field_class(key, value.lower(), obj_type=obj_type) + for d in columns + for key, value in d.items() + ] + mcp = MetadataChangeProposalWrapper( + entityUrn=make_dataset_urn( + platform=self.PLATFORM, name=dataset, env=self.config.env + ), + aspect=SchemaMetadataClass( + schemaName=dataset, + platform=make_data_platform_urn(self.PLATFORM), + version=0, + hash="", + platformSchema=OtherSchemaClass(rawSchema=""), + lastModified=AuditStampClass( + time=round(time.time() * 1000), + actor="urn:li:corpuser:ingestion", + ), + fields=fields, + ), + ) + self.report.obj_created += 1 + except Exception as e: + log.error(e) + self.report.obj_failures += 1 + return mcp + + def get_neo4j_metadata(self, query: str) -> pd.DataFrame: + driver = GraphDatabase.driver( + self.config.uri, auth=(self.config.username, self.config.password) + ) + """ + This process retrieves the metadata for Neo4j objects using an APOC query, which returns a dictionary + with two columns: key and value. The key represents the Neo4j object, while the value contains the + corresponding metadata. + + When data is returned from Neo4j, much of the relationship metadata is stored with the relevant node's + metadata. Consequently, the objects are organized into two separate dataframes: one for nodes and one for + relationships. + + In the node dataframe, several fields are extracted and added as new columns. Similarly, in the relationship + dataframe, certain fields are parsed out, while others require metadata from the nodes dataframe. + + Once the data is parsed and these two dataframes are created, we combine a subset of their columns into a + single dataframe, which will be used to create the DataHub objects. + + See the docs for examples of metadata: metadata-ingestion/docs/sources/neo4j/neo4j.md + """ + try: + log.info(f"{query}") + with driver.session() as session: + result = session.run(query) + data = [record for record in result] + log.info("Closing Neo4j driver") + driver.close() + + node_df = self.process_nodes(data) + rel_df = self.process_relationships(data, node_df) + + union_cols = ["key", "obj_type", "property_data_types", "description"] + df = pd.concat([node_df[union_cols], rel_df[union_cols]]) + except Exception as e: + self.report.failure( + message="Failed to get neo4j metadata", + exc=e, + ) + + return df + + def process_nodes(self, data: list) -> pd.DataFrame: + nodes = [record for record in data if record["value"]["type"] == self.NODE] + node_df = pd.DataFrame( + nodes, + columns=["key", "value"], + ) + node_df["obj_type"] = node_df["value"].apply( + lambda record: self.get_obj_type(record) + ) + node_df["relationships"] = node_df["value"].apply( + lambda record: self.get_relationships(record) + ) + node_df["properties"] = node_df["value"].apply( + lambda record: self.get_properties(record) + ) + node_df["property_data_types"] = node_df["properties"].apply( + lambda record: self.get_property_data_types(record) + ) + node_df["description"] = node_df.apply( + lambda record: self.get_node_description(record, node_df), axis=1 + ) + return node_df + + def process_relationships(self, data: list, node_df: pd.DataFrame) -> pd.DataFrame: + rels = [ + record for record in data if record["value"]["type"] == self.RELATIONSHIP + ] + rel_df = pd.DataFrame(rels, columns=["key", "value"]) + rel_df["obj_type"] = rel_df["value"].apply( + lambda record: self.get_obj_type(record) + ) + rel_df["properties"] = rel_df["value"].apply( + lambda record: self.get_properties(record) + ) + rel_df["property_data_types"] = rel_df["properties"].apply( + lambda record: self.get_property_data_types(record) + ) + rel_df["description"] = rel_df.apply( + lambda record: self.get_rel_descriptions(record, node_df), axis=1 + ) + return rel_df + + def get_obj_type(self, record: dict) -> str: + return record["type"] + + def get_rel_descriptions(self, record: dict, df: pd.DataFrame) -> str: + descriptions = [] + for _, row in df.iterrows(): + relationships = row.get("relationships", {}) + for relationship, props in relationships.items(): + if record["key"] == relationship: + if props["direction"] == "in": + for prop in props["labels"]: + descriptions.append( + f"({row['key']})-[{record['key']}]->({prop})" + ) + return "\n".join(descriptions) + + def get_node_description(self, record: dict, df: pd.DataFrame) -> str: + descriptions = [] + for _, row in df.iterrows(): + if record["key"] == row["key"]: + for relationship, props in row["relationships"].items(): + direction = props["direction"] + for node in set(props["labels"]): + if direction == "in": + descriptions.append( + f"({row['key']})<-[{relationship}]-({node})" + ) + elif direction == "out": + descriptions.append( + f"({row['key']})-[{relationship}]->({node})" + ) + + return "\n".join(descriptions) + + def get_property_data_types(self, record: dict) -> List[dict]: + return [{k: v["type"]} for k, v in record.items()] + + def get_properties(self, record: dict) -> str: + return record["properties"] + + def get_relationships(self, record: dict) -> dict: + return record.get("relationships", None) + + def get_workunits_internal(self) -> Iterable[MetadataWorkUnit]: + df = self.get_neo4j_metadata( + "CALL apoc.meta.schema() YIELD value UNWIND keys(value) AS key RETURN key, value[key] AS value;" + ) + for index, row in df.iterrows(): + try: + yield MetadataWorkUnit( + id=row["key"], + mcp=self.generate_neo4j_object( + columns=row["property_data_types"], + dataset=row["key"], + ), + is_primary_source=True, + ) + + yield MetadataWorkUnit( + id=row["key"], + mcp=MetadataChangeProposalWrapper( + entityUrn=make_dataset_urn( + platform=self.PLATFORM, + name=row["key"], + env=self.config.env, + ), + aspect=SubTypesClass( + typeNames=[ + DatasetSubTypes.NEO4J_NODE + if row["obj_type"] == self.NODE + else DatasetSubTypes.NEO4J_RELATIONSHIP + ] + ), + ), + ) + + yield MetadataWorkUnit( + id=row["key"], + mcp=self.add_properties( + dataset=row["key"], + custom_properties=None, + description=row["description"], + ), + ) + + except Exception as e: + raise e + + def get_report(self): + return self.report diff --git a/metadata-ingestion/src/datahub/ingestion/source/sql/sql_types.py b/metadata-ingestion/src/datahub/ingestion/source/sql/sql_types.py index 89ca160ba1f487..9ec73a9af96dc5 100644 --- a/metadata-ingestion/src/datahub/ingestion/source/sql/sql_types.py +++ b/metadata-ingestion/src/datahub/ingestion/source/sql/sql_types.py @@ -276,7 +276,6 @@ def resolve_vertica_modified_type(type_string: str) -> Any: return VERTICA_SQL_TYPES_MAP[type_string] -# see https://docs.snowflake.com/en/sql-reference/intro-summary-data-types.html SNOWFLAKE_TYPES_MAP: Dict[str, Any] = { "NUMBER": NumberType, "DECIMAL": NumberType, @@ -312,6 +311,18 @@ def resolve_vertica_modified_type(type_string: str) -> Any: "GEOGRAPHY": None, } + +def resolve_snowflake_modified_type(type_string: str) -> Any: + # Match types with precision and scale, e.g., 'DECIMAL(38,0)' + match = re.match(r"([a-zA-Z_]+)\(\d+,\s\d+\)", type_string) + if match: + modified_type_base = match.group(1) # Extract the base type + return SNOWFLAKE_TYPES_MAP.get(modified_type_base, None) + + # Fallback for types without precision/scale + return SNOWFLAKE_TYPES_MAP.get(type_string, None) + + # see https://github.com/googleapis/python-bigquery-sqlalchemy/blob/main/sqlalchemy_bigquery/_types.py#L32 BIGQUERY_TYPES_MAP: Dict[str, Any] = { "STRING": StringType, @@ -380,6 +391,7 @@ def resolve_vertica_modified_type(type_string: str) -> Any: "row": RecordType, "map": MapType, "array": ArrayType, + "json": RecordType, } # https://docs.aws.amazon.com/athena/latest/ug/data-types.html @@ -490,7 +502,7 @@ def resolve_sql_type( TypeClass = resolve_vertica_modified_type(column_type) elif platform == "snowflake": # Snowflake types are uppercase, so we check that. - TypeClass = _merged_mapping.get(column_type.upper()) + TypeClass = resolve_snowflake_modified_type(column_type.upper()) if TypeClass: return TypeClass() diff --git a/metadata-ingestion/src/datahub/ingestion/transformer/add_dataset_tags.py b/metadata-ingestion/src/datahub/ingestion/transformer/add_dataset_tags.py index c60f4dca28882d..355ca7a373653f 100644 --- a/metadata-ingestion/src/datahub/ingestion/transformer/add_dataset_tags.py +++ b/metadata-ingestion/src/datahub/ingestion/transformer/add_dataset_tags.py @@ -74,7 +74,7 @@ def handle_end_of_stream( logger.debug("Generating tags") for tag_association in self.processed_tags.values(): - tag_urn = TagUrn.create_from_string(tag_association.tag) + tag_urn = TagUrn.from_string(tag_association.tag) mcps.append( MetadataChangeProposalWrapper( entityUrn=tag_urn.urn(), diff --git a/metadata-ingestion/src/datahub/ingestion/transformer/generic_aspect_transformer.py b/metadata-ingestion/src/datahub/ingestion/transformer/generic_aspect_transformer.py index 3c0bc00633e7cb..5bf70274dce89d 100644 --- a/metadata-ingestion/src/datahub/ingestion/transformer/generic_aspect_transformer.py +++ b/metadata-ingestion/src/datahub/ingestion/transformer/generic_aspect_transformer.py @@ -100,7 +100,7 @@ def transform( ) if transformed_aspect: # for end of stream records, we modify the workunit-id - structured_urn = Urn.create_from_string(urn) + structured_urn = Urn.from_string(urn) simple_name = "-".join(structured_urn.get_entity_id()) record_metadata = envelope.metadata.copy() record_metadata.update( diff --git a/metadata-ingestion/src/datahub/integrations/assertion/common.py b/metadata-ingestion/src/datahub/integrations/assertion/common.py index 9ffad5cf66640a..f0b7510df14a35 100644 --- a/metadata-ingestion/src/datahub/integrations/assertion/common.py +++ b/metadata-ingestion/src/datahub/integrations/assertion/common.py @@ -42,7 +42,7 @@ def get_entity_name(assertion: BaseEntityAssertion) -> Tuple[str, str, str]: if qualified_name is not None: parts = qualified_name.split(".") else: - urn_id = Urn.create_from_string(assertion.entity).entity_ids[1] + urn_id = Urn.from_string(assertion.entity).entity_ids[1] parts = urn_id.split(".") if len(parts) > 3: parts = parts[-3:] diff --git a/metadata-ingestion/src/datahub/lite/duckdb_lite.py b/metadata-ingestion/src/datahub/lite/duckdb_lite.py index f40a2e9498e62c..89317383520923 100644 --- a/metadata-ingestion/src/datahub/lite/duckdb_lite.py +++ b/metadata-ingestion/src/datahub/lite/duckdb_lite.py @@ -609,7 +609,7 @@ def get_typed_aspect( aspect_map, DataPlatformInstanceClass ) # type: ignore - needs_platform = Urn.create_from_string(entity_urn).get_type() in [ + needs_platform = Urn.from_string(entity_urn).get_type() in [ "dataset", "container", "chart", @@ -617,7 +617,7 @@ def get_typed_aspect( "dataFlow", "dataJob", ] - entity_urn_parsed = Urn.create_from_string(entity_urn) + entity_urn_parsed = Urn.from_string(entity_urn) if entity_urn_parsed.get_type() in ["dataFlow", "dataJob"]: self.add_edge( entity_urn, @@ -630,15 +630,12 @@ def get_typed_aspect( # this is a top-level entity if not dpi: logger.debug(f"No data platform instance for {entity_urn}") - maybe_parent_urn = Urn.create_from_string(entity_urn).get_entity_id()[0] + maybe_parent_urn = Urn.from_string(entity_urn).get_entity_id()[0] needs_dpi = False if maybe_parent_urn.startswith(Urn.URN_PREFIX): parent_urn = maybe_parent_urn - if ( - Urn.create_from_string(maybe_parent_urn).get_type() - == "dataPlatform" - ): - data_platform_urn = DataPlatformUrn.create_from_string( + if Urn.from_string(maybe_parent_urn).get_type() == "dataPlatform": + data_platform_urn = DataPlatformUrn.from_string( maybe_parent_urn ) needs_dpi = True @@ -660,7 +657,7 @@ def get_typed_aspect( logger.error(f"Failed to generate edges entity {entity_urn}", e) parent_urn = str(data_platform_instance_urn) else: - data_platform_urn = DataPlatformUrn.create_from_string(dpi.platform) + data_platform_urn = DataPlatformUrn.from_string(dpi.platform) data_platform_instance = dpi.instance or "default" data_platform_instance_urn = Urn( entity_type="dataPlatformInstance", @@ -673,9 +670,7 @@ def get_typed_aspect( parent_urn = "__root__" types = ( - subtypes.typeNames - if subtypes - else [Urn.create_from_string(entity_urn).get_type()] + subtypes.typeNames if subtypes else [Urn.from_string(entity_urn).get_type()] ) for t in types: type_urn = Urn(entity_type="systemNode", entity_id=[parent_urn, t]) @@ -686,7 +681,7 @@ def get_typed_aspect( def _create_edges_from_data_platform_instance( self, data_platform_instance_urn: Urn ) -> None: - data_platform_urn = DataPlatformUrn.create_from_string( + data_platform_urn = DataPlatformUrn.from_string( data_platform_instance_urn.get_entity_id()[0] ) data_platform_instances_urn = Urn( @@ -735,7 +730,7 @@ def post_update_hook( if isinstance(aspect, DatasetPropertiesClass): dp: DatasetPropertiesClass = aspect if dp.name: - specific_urn = DatasetUrn.create_from_string(entity_urn) + specific_urn = DatasetUrn.from_string(entity_urn) if ( specific_urn.get_data_platform_urn().get_entity_id_as_string() == "looker" @@ -755,7 +750,7 @@ def post_update_hook( self.add_edge(entity_urn, "name", cp.name, remove_existing=True) elif isinstance(aspect, DataPlatformInstanceClass): dpi: DataPlatformInstanceClass = aspect - data_platform_urn = DataPlatformUrn.create_from_string(dpi.platform) + data_platform_urn = DataPlatformUrn.from_string(dpi.platform) data_platform_instance = dpi.instance or "default" data_platform_instance_urn = Urn( entity_type="dataPlatformInstance", @@ -763,7 +758,7 @@ def post_update_hook( ) self._create_edges_from_data_platform_instance(data_platform_instance_urn) elif isinstance(aspect, ChartInfoClass): - urn = Urn.create_from_string(entity_urn) + urn = Urn.from_string(entity_urn) self.add_edge( entity_urn, "name", @@ -771,7 +766,7 @@ def post_update_hook( remove_existing=True, ) elif isinstance(aspect, DashboardInfoClass): - urn = Urn.create_from_string(entity_urn) + urn = Urn.from_string(entity_urn) self.add_edge( entity_urn, "name", diff --git a/metadata-ingestion/src/datahub/specific/chart.py b/metadata-ingestion/src/datahub/specific/chart.py index cc68168b68db7e..104a7c21a07e2f 100644 --- a/metadata-ingestion/src/datahub/specific/chart.py +++ b/metadata-ingestion/src/datahub/specific/chart.py @@ -1,10 +1,8 @@ -import time from typing import Dict, List, Optional, Union from datahub.emitter.mcp_patch_builder import MetadataPatchProposal from datahub.metadata.schema_classes import ( AccessLevelClass, - AuditStampClass, ChangeAuditStampsClass, ChartInfoClass as ChartInfo, ChartTypeClass, @@ -47,43 +45,6 @@ def __init__( ) self.ownership_patch_helper = OwnershipPatchHelper(self) - def _mint_auditstamp(self, message: Optional[str] = None) -> AuditStampClass: - """ - Creates an AuditStampClass instance with the current timestamp and other default values. - - Args: - message: The message associated with the audit stamp (optional). - - Returns: - An instance of AuditStampClass. - """ - return AuditStampClass( - time=int(time.time() * 1000.0), - actor="urn:li:corpuser:datahub", - message=message, - ) - - def _ensure_urn_type( - self, entity_type: str, edges: List[Edge], context: str - ) -> None: - """ - Ensures that the destination URNs in the given edges have the specified entity type. - - Args: - entity_type: The entity type to check against. - edges: A list of Edge objects. - context: The context or description of the operation. - - Raises: - ValueError: If any of the destination URNs is not of the specified entity type. - """ - for e in edges: - urn = Urn.create_from_string(e.destinationUrn) - if not urn.get_type() == entity_type: - raise ValueError( - f"{context}: {e.destinationUrn} is not of type {entity_type}" - ) - def add_owner(self, owner: Owner) -> "ChartPatchBuilder": """ Adds an owner to the ChartPatchBuilder. diff --git a/metadata-ingestion/src/datahub/specific/dashboard.py b/metadata-ingestion/src/datahub/specific/dashboard.py index f57df15914369c..da5abbfd1dc129 100644 --- a/metadata-ingestion/src/datahub/specific/dashboard.py +++ b/metadata-ingestion/src/datahub/specific/dashboard.py @@ -1,10 +1,8 @@ -import time from typing import Dict, List, Optional, Union from datahub.emitter.mcp_patch_builder import MetadataPatchProposal from datahub.metadata.schema_classes import ( AccessLevelClass, - AuditStampClass, ChangeAuditStampsClass, DashboardInfoClass as DashboardInfo, EdgeClass as Edge, @@ -46,43 +44,6 @@ def __init__( ) self.ownership_patch_helper = OwnershipPatchHelper(self) - def _mint_auditstamp(self, message: Optional[str] = None) -> AuditStampClass: - """ - Creates an AuditStampClass instance with the current timestamp and other default values. - - Args: - message: The message associated with the audit stamp (optional). - - Returns: - An instance of AuditStampClass. - """ - return AuditStampClass( - time=int(time.time() * 1000.0), - actor="urn:li:corpuser:datahub", - message=message, - ) - - def _ensure_urn_type( - self, entity_type: str, edges: List[Edge], context: str - ) -> None: - """ - Ensures that the destination URNs in the given edges have the specified entity type. - - Args: - entity_type: The entity type to check against. - edges: A list of Edge objects. - context: The context or description of the operation. - - Raises: - ValueError: If any of the destination URNs is not of the specified entity type. - """ - for e in edges: - urn = Urn.create_from_string(e.destinationUrn) - if not urn.get_type() == entity_type: - raise ValueError( - f"{context}: {e.destinationUrn} is not of type {entity_type}" - ) - def add_owner(self, owner: Owner) -> "DashboardPatchBuilder": """ Adds an owner to the DashboardPatchBuilder. diff --git a/metadata-ingestion/src/datahub/specific/datajob.py b/metadata-ingestion/src/datahub/specific/datajob.py index 8da8edc8ef0f22..fb7b0ae7816f17 100644 --- a/metadata-ingestion/src/datahub/specific/datajob.py +++ b/metadata-ingestion/src/datahub/specific/datajob.py @@ -1,9 +1,7 @@ -import time from typing import Dict, List, Optional, Union from datahub.emitter.mcp_patch_builder import MetadataPatchProposal from datahub.metadata.schema_classes import ( - AuditStampClass, DataJobInfoClass as DataJobInfo, DataJobInputOutputClass as DataJobInputOutput, EdgeClass as Edge, @@ -16,10 +14,9 @@ SystemMetadataClass, TagAssociationClass as Tag, ) +from datahub.metadata.urns import SchemaFieldUrn, TagUrn, Urn from datahub.specific.custom_properties import CustomPropertiesPatchHelper from datahub.specific.ownership import OwnershipPatchHelper -from datahub.utilities.urns.tag_urn import TagUrn -from datahub.utilities.urns.urn import Urn class DataJobPatchBuilder(MetadataPatchProposal): @@ -45,43 +42,6 @@ def __init__( ) self.ownership_patch_helper = OwnershipPatchHelper(self) - def _mint_auditstamp(self, message: Optional[str] = None) -> AuditStampClass: - """ - Creates an AuditStampClass instance with the current timestamp and other default values. - - Args: - message: The message associated with the audit stamp (optional). - - Returns: - An instance of AuditStampClass. - """ - return AuditStampClass( - time=int(time.time() * 1000.0), - actor="urn:li:corpuser:datahub", - message=message, - ) - - def _ensure_urn_type( - self, entity_type: str, edges: List[Edge], context: str - ) -> None: - """ - Ensures that the destination URNs in the given edges have the specified entity type. - - Args: - entity_type: The entity type to check against. - edges: A list of Edge objects. - context: The context or description of the operation. - - Raises: - ValueError: If any of the destination URNs is not of the specified entity type. - """ - for e in edges: - urn = Urn.create_from_string(e.destinationUrn) - if not urn.get_type() == entity_type: - raise ValueError( - f"{context}: {e.destinationUrn} is not of type {entity_type}" - ) - def add_owner(self, owner: Owner) -> "DataJobPatchBuilder": """ Adds an owner to the DataJobPatchBuilder. @@ -392,9 +352,7 @@ def add_input_dataset_field(self, input: Union[Urn, str]) -> "DataJobPatchBuilde ValueError: If the input is not a Schema Field urn. """ input_urn = str(input) - urn = Urn.create_from_string(input_urn) - if not urn.get_type() == "schemaField": - raise ValueError(f"Input {input} is not a Schema Field urn") + assert SchemaFieldUrn.from_string(input_urn) self._add_patch( DataJobInputOutput.ASPECT_NAME, @@ -466,9 +424,7 @@ def add_output_dataset_field( ValueError: If the output is not a Schema Field urn. """ output_urn = str(output) - urn = Urn.create_from_string(output_urn) - if not urn.get_type() == "schemaField": - raise ValueError(f"Input {output} is not a Schema Field urn") + assert SchemaFieldUrn.from_string(output_urn) self._add_patch( DataJobInputOutput.ASPECT_NAME, diff --git a/metadata-ingestion/src/datahub/utilities/urns/_urn_base.py b/metadata-ingestion/src/datahub/utilities/urns/_urn_base.py index 1b50d4b2fe810c..7dadd16fb7f1c2 100644 --- a/metadata-ingestion/src/datahub/utilities/urns/_urn_base.py +++ b/metadata-ingestion/src/datahub/utilities/urns/_urn_base.py @@ -200,7 +200,7 @@ def get_entity_id_as_string(self) -> str: @classmethod @deprecated(reason="no longer needed") def validate(cls, urn_str: str) -> None: - Urn.create_from_string(urn_str) + Urn.from_string(urn_str) @staticmethod def url_encode(urn: str) -> str: diff --git a/metadata-ingestion/src/datahub/utilities/urns/structured_properties_urn.py b/metadata-ingestion/src/datahub/utilities/urns/structured_properties_urn.py index 6774978c7a76d9..748d5519f14773 100644 --- a/metadata-ingestion/src/datahub/utilities/urns/structured_properties_urn.py +++ b/metadata-ingestion/src/datahub/utilities/urns/structured_properties_urn.py @@ -4,4 +4,4 @@ def make_structured_property_urn(structured_property_id: str) -> str: - return str(StructuredPropertyUrn.create_from_string(structured_property_id)) + return str(StructuredPropertyUrn.from_string(structured_property_id)) diff --git a/metadata-ingestion/tests/integration/dremio/dremio_mces_golden.json b/metadata-ingestion/tests/integration/dremio/dremio_mces_golden.json index df89255c300481..3a8fce62f4bb36 100644 --- a/metadata-ingestion/tests/integration/dremio/dremio_mces_golden.json +++ b/metadata-ingestion/tests/integration/dremio/dremio_mces_golden.json @@ -15,7 +15,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -31,7 +31,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -49,7 +49,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -65,7 +65,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -85,7 +85,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -105,7 +105,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -121,7 +121,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -139,7 +139,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -155,7 +155,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -175,7 +175,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -195,7 +195,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -211,7 +211,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -229,7 +229,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -245,7 +245,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -265,7 +265,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -285,7 +285,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -301,7 +301,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -319,7 +319,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -335,7 +335,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -355,7 +355,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -375,7 +375,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -391,7 +391,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -409,7 +409,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -425,7 +425,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -445,7 +445,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -465,7 +465,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -481,7 +481,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -497,7 +497,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -515,7 +515,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -531,7 +531,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -555,7 +555,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -575,7 +575,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -591,7 +591,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -607,7 +607,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -625,7 +625,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -641,7 +641,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -665,7 +665,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -685,7 +685,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -701,7 +701,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -717,7 +717,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -735,7 +735,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -751,7 +751,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -775,7 +775,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -795,7 +795,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -811,7 +811,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -827,7 +827,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -845,7 +845,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -861,7 +861,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -885,7 +885,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -905,7 +905,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -921,7 +921,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -937,7 +937,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -955,7 +955,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -971,7 +971,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -995,7 +995,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1015,7 +1015,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1031,7 +1031,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1047,7 +1047,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1065,7 +1065,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1081,7 +1081,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1105,7 +1105,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1125,7 +1125,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1141,7 +1141,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1157,7 +1157,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1175,7 +1175,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1191,7 +1191,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1215,7 +1215,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1235,7 +1235,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1251,7 +1251,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1267,7 +1267,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1285,7 +1285,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1301,7 +1301,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1325,7 +1325,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1345,7 +1345,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1361,7 +1361,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1377,7 +1377,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1395,7 +1395,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1411,7 +1411,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1435,7 +1435,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1455,7 +1455,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1471,7 +1471,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1487,7 +1487,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1505,7 +1505,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1521,7 +1521,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1549,7 +1549,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1569,7 +1569,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1585,7 +1585,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1601,7 +1601,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1619,7 +1619,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1635,7 +1635,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1663,7 +1663,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1683,7 +1683,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1699,7 +1699,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1715,7 +1715,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1733,7 +1733,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1749,7 +1749,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1781,7 +1781,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1801,7 +1801,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1817,7 +1817,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1833,7 +1833,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1851,7 +1851,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1867,7 +1867,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1903,7 +1903,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1927,7 +1927,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1945,7 +1945,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1961,7 +1961,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1977,7 +1977,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -1995,7 +1995,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2025,7 +2025,7 @@ }, "fields": [ { - "fieldPath": "A", + "fieldPath": "F", "nullable": true, "type": { "type": { @@ -2037,7 +2037,7 @@ "isPartOfKey": false }, { - "fieldPath": "I", + "fieldPath": "G", "nullable": true, "type": { "type": { @@ -2061,7 +2061,7 @@ "isPartOfKey": false }, { - "fieldPath": "G", + "fieldPath": "I", "nullable": true, "type": { "type": { @@ -2073,7 +2073,7 @@ "isPartOfKey": false }, { - "fieldPath": "F", + "fieldPath": "A", "nullable": true, "type": { "type": { @@ -2085,7 +2085,7 @@ "isPartOfKey": false }, { - "fieldPath": "E", + "fieldPath": "B", "nullable": true, "type": { "type": { @@ -2097,7 +2097,7 @@ "isPartOfKey": false }, { - "fieldPath": "D", + "fieldPath": "C", "nullable": true, "type": { "type": { @@ -2109,7 +2109,7 @@ "isPartOfKey": false }, { - "fieldPath": "C", + "fieldPath": "D", "nullable": true, "type": { "type": { @@ -2121,7 +2121,7 @@ "isPartOfKey": false }, { - "fieldPath": "B", + "fieldPath": "E", "nullable": true, "type": { "type": { @@ -2137,7 +2137,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2153,7 +2153,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2177,7 +2177,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2201,7 +2201,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2219,7 +2219,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2235,7 +2235,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2251,7 +2251,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2269,7 +2269,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2299,31 +2299,31 @@ }, "fields": [ { - "fieldPath": "id", + "fieldPath": "email_address", "nullable": true, "type": { "type": { - "com.linkedin.schema.NumberType": {} + "com.linkedin.schema.StringType": {} } }, - "nativeDataType": "integer(32)", + "nativeDataType": "character varying(65536)", "recursive": false, "isPartOfKey": false }, { - "fieldPath": "company", + "fieldPath": "priority", "nullable": true, "type": { "type": { - "com.linkedin.schema.StringType": {} + "com.linkedin.schema.NumberType": {} } }, - "nativeDataType": "character varying(65536)", + "nativeDataType": "float(24)", "recursive": false, "isPartOfKey": false }, { - "fieldPath": "last_name", + "fieldPath": "company", "nullable": true, "type": { "type": { @@ -2335,31 +2335,31 @@ "isPartOfKey": false }, { - "fieldPath": "first_name", + "fieldPath": "id", "nullable": true, "type": { "type": { - "com.linkedin.schema.StringType": {} + "com.linkedin.schema.NumberType": {} } }, - "nativeDataType": "character varying(65536)", + "nativeDataType": "integer(32)", "recursive": false, "isPartOfKey": false }, { - "fieldPath": "priority", + "fieldPath": "first_name", "nullable": true, "type": { "type": { - "com.linkedin.schema.NumberType": {} + "com.linkedin.schema.StringType": {} } }, - "nativeDataType": "float(24)", + "nativeDataType": "character varying(65536)", "recursive": false, "isPartOfKey": false }, { - "fieldPath": "email_address", + "fieldPath": "last_name", "nullable": true, "type": { "type": { @@ -2375,7 +2375,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2391,7 +2391,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2419,7 +2419,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2443,7 +2443,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2461,7 +2461,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2477,7 +2477,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2493,7 +2493,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2511,7 +2511,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2541,7 +2541,7 @@ }, "fields": [ { - "fieldPath": "urn", + "fieldPath": "createdby", "nullable": true, "type": { "type": { @@ -2553,7 +2553,7 @@ "isPartOfKey": false }, { - "fieldPath": "aspect", + "fieldPath": "createdfor", "nullable": true, "type": { "type": { @@ -2565,19 +2565,19 @@ "isPartOfKey": false }, { - "fieldPath": "version", + "fieldPath": "urn", "nullable": true, "type": { "type": { - "com.linkedin.schema.NumberType": {} + "com.linkedin.schema.StringType": {} } }, - "nativeDataType": "bigint(64)", + "nativeDataType": "character varying(65536)", "recursive": false, "isPartOfKey": false }, { - "fieldPath": "metadata", + "fieldPath": "aspect", "nullable": true, "type": { "type": { @@ -2589,19 +2589,19 @@ "isPartOfKey": false }, { - "fieldPath": "createdon", + "fieldPath": "version", "nullable": true, "type": { "type": { - "com.linkedin.schema.DateType": {} + "com.linkedin.schema.NumberType": {} } }, - "nativeDataType": "timestamp(23)", + "nativeDataType": "bigint(64)", "recursive": false, "isPartOfKey": false }, { - "fieldPath": "createdby", + "fieldPath": "metadata", "nullable": true, "type": { "type": { @@ -2613,14 +2613,14 @@ "isPartOfKey": false }, { - "fieldPath": "createdfor", + "fieldPath": "createdon", "nullable": true, "type": { "type": { - "com.linkedin.schema.StringType": {} + "com.linkedin.schema.DateType": {} } }, - "nativeDataType": "character varying(65536)", + "nativeDataType": "timestamp(23)", "recursive": false, "isPartOfKey": false } @@ -2629,7 +2629,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2645,7 +2645,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2673,7 +2673,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2697,7 +2697,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2715,7 +2715,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2731,7 +2731,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2747,7 +2747,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2765,7 +2765,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2795,19 +2795,19 @@ }, "fields": [ { - "fieldPath": "path", + "fieldPath": "id", "nullable": true, "type": { "type": { - "com.linkedin.schema.StringType": {} + "com.linkedin.schema.NumberType": {} } }, - "nativeDataType": "character varying(65536)", + "nativeDataType": "bigint(64)", "recursive": false, "isPartOfKey": false }, { - "fieldPath": "aspect", + "fieldPath": "urn", "nullable": true, "type": { "type": { @@ -2819,26 +2819,26 @@ "isPartOfKey": false }, { - "fieldPath": "urn", + "fieldPath": "longVal", "nullable": true, "type": { "type": { - "com.linkedin.schema.StringType": {} + "com.linkedin.schema.NumberType": {} } }, - "nativeDataType": "character varying(65536)", + "nativeDataType": "bigint(64)", "recursive": false, "isPartOfKey": false }, { - "fieldPath": "id", + "fieldPath": "stringVal", "nullable": true, "type": { "type": { - "com.linkedin.schema.NumberType": {} + "com.linkedin.schema.StringType": {} } }, - "nativeDataType": "bigint(64)", + "nativeDataType": "character varying(65536)", "recursive": false, "isPartOfKey": false }, @@ -2855,7 +2855,7 @@ "isPartOfKey": false }, { - "fieldPath": "stringVal", + "fieldPath": "path", "nullable": true, "type": { "type": { @@ -2867,14 +2867,14 @@ "isPartOfKey": false }, { - "fieldPath": "longVal", + "fieldPath": "aspect", "nullable": true, "type": { "type": { - "com.linkedin.schema.NumberType": {} + "com.linkedin.schema.StringType": {} } }, - "nativeDataType": "bigint(64)", + "nativeDataType": "character varying(65536)", "recursive": false, "isPartOfKey": false } @@ -2883,7 +2883,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2899,7 +2899,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2927,7 +2927,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2951,7 +2951,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2969,7 +2969,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -2985,7 +2985,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3001,7 +3001,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3019,7 +3019,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3049,19 +3049,19 @@ }, "fields": [ { - "fieldPath": "doubleVal", + "fieldPath": "id", "nullable": true, "type": { "type": { "com.linkedin.schema.NumberType": {} } }, - "nativeDataType": "double(53)", + "nativeDataType": "bigint(64)", "recursive": false, "isPartOfKey": false }, { - "fieldPath": "path", + "fieldPath": "urn", "nullable": true, "type": { "type": { @@ -3073,7 +3073,7 @@ "isPartOfKey": false }, { - "fieldPath": "urn", + "fieldPath": "path", "nullable": true, "type": { "type": { @@ -3085,14 +3085,14 @@ "isPartOfKey": false }, { - "fieldPath": "id", + "fieldPath": "doubleVal", "nullable": true, "type": { "type": { "com.linkedin.schema.NumberType": {} } }, - "nativeDataType": "bigint(64)", + "nativeDataType": "double(53)", "recursive": false, "isPartOfKey": false } @@ -3101,7 +3101,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3117,7 +3117,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3145,7 +3145,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3169,7 +3169,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3187,7 +3187,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3203,7 +3203,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3219,7 +3219,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3237,7 +3237,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3267,7 +3267,7 @@ }, "fields": [ { - "fieldPath": "id", + "fieldPath": "customer_id", "nullable": true, "type": { "type": { @@ -3291,7 +3291,7 @@ "isPartOfKey": false }, { - "fieldPath": "customer_id", + "fieldPath": "id", "nullable": true, "type": { "type": { @@ -3307,7 +3307,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3323,7 +3323,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3351,7 +3351,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3375,7 +3375,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3393,7 +3393,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3409,7 +3409,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3425,7 +3425,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3443,7 +3443,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3473,7 +3473,7 @@ }, "fields": [ { - "fieldPath": "id", + "fieldPath": "salary", "nullable": true, "type": { "type": { @@ -3485,31 +3485,31 @@ "isPartOfKey": false }, { - "fieldPath": "name", + "fieldPath": "age", "nullable": true, "type": { "type": { - "com.linkedin.schema.StringType": {} + "com.linkedin.schema.NumberType": {} } }, - "nativeDataType": "character varying(65536)", + "nativeDataType": "bigint(64)", "recursive": false, "isPartOfKey": false }, { - "fieldPath": "age", + "fieldPath": "name", "nullable": true, "type": { "type": { - "com.linkedin.schema.NumberType": {} + "com.linkedin.schema.StringType": {} } }, - "nativeDataType": "bigint(64)", + "nativeDataType": "character varying(65536)", "recursive": false, "isPartOfKey": false }, { - "fieldPath": "salary", + "fieldPath": "id", "nullable": true, "type": { "type": { @@ -3525,7 +3525,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3541,7 +3541,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3569,7 +3569,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3593,7 +3593,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3611,7 +3611,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3627,7 +3627,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3643,7 +3643,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3725,7 +3725,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3741,7 +3741,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3766,7 +3766,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3794,7 +3794,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3818,7 +3818,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3836,7 +3836,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3852,7 +3852,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3868,7 +3868,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -3910,7 +3910,7 @@ "isPartOfKey": false }, { - "fieldPath": "aspect", + "fieldPath": "createdfor", "nullable": true, "type": { "type": { @@ -3922,55 +3922,55 @@ "isPartOfKey": false }, { - "fieldPath": "version", + "fieldPath": "createdby", "nullable": true, "type": { "type": { - "com.linkedin.schema.NumberType": {} + "com.linkedin.schema.StringType": {} } }, - "nativeDataType": "bigint(64)", + "nativeDataType": "character varying(65536)", "recursive": false, "isPartOfKey": false }, { - "fieldPath": "metadata", + "fieldPath": "createdon", "nullable": true, "type": { "type": { - "com.linkedin.schema.StringType": {} + "com.linkedin.schema.DateType": {} } }, - "nativeDataType": "character varying(65536)", + "nativeDataType": "timestamp(23)", "recursive": false, "isPartOfKey": false }, { - "fieldPath": "createdon", + "fieldPath": "metadata", "nullable": true, "type": { "type": { - "com.linkedin.schema.DateType": {} + "com.linkedin.schema.StringType": {} } }, - "nativeDataType": "timestamp(23)", + "nativeDataType": "character varying(65536)", "recursive": false, "isPartOfKey": false }, { - "fieldPath": "createdby", + "fieldPath": "version", "nullable": true, "type": { "type": { - "com.linkedin.schema.StringType": {} + "com.linkedin.schema.NumberType": {} } }, - "nativeDataType": "character varying(65536)", + "nativeDataType": "bigint(64)", "recursive": false, "isPartOfKey": false }, { - "fieldPath": "createdfor", + "fieldPath": "aspect", "nullable": true, "type": { "type": { @@ -3986,7 +3986,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4002,7 +4002,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4027,7 +4027,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4055,7 +4055,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4079,7 +4079,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4097,7 +4097,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4113,7 +4113,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4129,7 +4129,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4247,7 +4247,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4263,7 +4263,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4288,7 +4288,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4316,7 +4316,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4340,7 +4340,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4358,7 +4358,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4374,7 +4374,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4390,7 +4390,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4432,38 +4432,38 @@ "isPartOfKey": false }, { - "fieldPath": "doubleVal", + "fieldPath": "id", "nullable": true, "type": { "type": { "com.linkedin.schema.NumberType": {} } }, - "nativeDataType": "double(53)", + "nativeDataType": "bigint(64)", "recursive": false, "isPartOfKey": false }, { - "fieldPath": "id", + "fieldPath": "urn", "nullable": true, "type": { "type": { - "com.linkedin.schema.NumberType": {} + "com.linkedin.schema.StringType": {} } }, - "nativeDataType": "bigint(64)", + "nativeDataType": "character varying(65536)", "recursive": false, "isPartOfKey": false }, { - "fieldPath": "urn", + "fieldPath": "doubleVal", "nullable": true, "type": { "type": { - "com.linkedin.schema.StringType": {} + "com.linkedin.schema.NumberType": {} } }, - "nativeDataType": "character varying(65536)", + "nativeDataType": "double(53)", "recursive": false, "isPartOfKey": false } @@ -4472,7 +4472,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4488,7 +4488,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4513,7 +4513,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4541,7 +4541,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4565,7 +4565,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4583,7 +4583,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4599,7 +4599,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4615,7 +4615,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4721,7 +4721,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4737,7 +4737,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4762,7 +4762,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4790,7 +4790,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4814,7 +4814,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4832,7 +4832,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4848,7 +4848,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4864,7 +4864,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4894,7 +4894,7 @@ }, "fields": [ { - "fieldPath": "id", + "fieldPath": "customer_id", "nullable": true, "type": { "type": { @@ -4906,26 +4906,26 @@ "isPartOfKey": false }, { - "fieldPath": "description", + "fieldPath": "id", "nullable": true, "type": { "type": { - "com.linkedin.schema.StringType": {} + "com.linkedin.schema.NumberType": {} } }, - "nativeDataType": "character varying(65536)", + "nativeDataType": "integer(32)", "recursive": false, "isPartOfKey": false }, { - "fieldPath": "customer_id", + "fieldPath": "description", "nullable": true, "type": { "type": { - "com.linkedin.schema.NumberType": {} + "com.linkedin.schema.StringType": {} } }, - "nativeDataType": "integer(32)", + "nativeDataType": "character varying(65536)", "recursive": false, "isPartOfKey": false } @@ -4934,7 +4934,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4950,7 +4950,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -4975,7 +4975,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5003,7 +5003,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5027,7 +5027,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5045,7 +5045,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5061,7 +5061,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5077,7 +5077,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5107,7 +5107,7 @@ }, "fields": [ { - "fieldPath": "B", + "fieldPath": "F", "nullable": true, "type": { "type": { @@ -5119,7 +5119,7 @@ "isPartOfKey": false }, { - "fieldPath": "C", + "fieldPath": "G", "nullable": true, "type": { "type": { @@ -5131,7 +5131,7 @@ "isPartOfKey": false }, { - "fieldPath": "D", + "fieldPath": "H", "nullable": true, "type": { "type": { @@ -5143,7 +5143,7 @@ "isPartOfKey": false }, { - "fieldPath": "E", + "fieldPath": "I", "nullable": true, "type": { "type": { @@ -5155,7 +5155,7 @@ "isPartOfKey": false }, { - "fieldPath": "F", + "fieldPath": "A", "nullable": true, "type": { "type": { @@ -5167,7 +5167,7 @@ "isPartOfKey": false }, { - "fieldPath": "G", + "fieldPath": "B", "nullable": true, "type": { "type": { @@ -5179,7 +5179,7 @@ "isPartOfKey": false }, { - "fieldPath": "H", + "fieldPath": "C", "nullable": true, "type": { "type": { @@ -5191,7 +5191,7 @@ "isPartOfKey": false }, { - "fieldPath": "I", + "fieldPath": "D", "nullable": true, "type": { "type": { @@ -5203,7 +5203,7 @@ "isPartOfKey": false }, { - "fieldPath": "A", + "fieldPath": "E", "nullable": true, "type": { "type": { @@ -5219,7 +5219,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5235,7 +5235,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5260,7 +5260,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5288,7 +5288,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5312,7 +5312,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5330,7 +5330,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5346,7 +5346,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5362,7 +5362,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5392,7 +5392,7 @@ }, "fields": [ { - "fieldPath": "I", + "fieldPath": "A", "nullable": true, "type": { "type": { @@ -5404,7 +5404,7 @@ "isPartOfKey": false }, { - "fieldPath": "A", + "fieldPath": "B", "nullable": true, "type": { "type": { @@ -5416,7 +5416,7 @@ "isPartOfKey": false }, { - "fieldPath": "B", + "fieldPath": "C", "nullable": true, "type": { "type": { @@ -5428,7 +5428,7 @@ "isPartOfKey": false }, { - "fieldPath": "C", + "fieldPath": "D", "nullable": true, "type": { "type": { @@ -5440,7 +5440,7 @@ "isPartOfKey": false }, { - "fieldPath": "D", + "fieldPath": "E", "nullable": true, "type": { "type": { @@ -5452,7 +5452,7 @@ "isPartOfKey": false }, { - "fieldPath": "E", + "fieldPath": "F", "nullable": true, "type": { "type": { @@ -5464,7 +5464,7 @@ "isPartOfKey": false }, { - "fieldPath": "F", + "fieldPath": "G", "nullable": true, "type": { "type": { @@ -5476,7 +5476,7 @@ "isPartOfKey": false }, { - "fieldPath": "G", + "fieldPath": "H", "nullable": true, "type": { "type": { @@ -5488,7 +5488,7 @@ "isPartOfKey": false }, { - "fieldPath": "H", + "fieldPath": "I", "nullable": true, "type": { "type": { @@ -5552,7 +5552,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5568,7 +5568,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5593,7 +5593,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5625,7 +5625,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5649,7 +5649,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5667,7 +5667,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5683,7 +5683,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5699,7 +5699,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5781,7 +5781,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5797,7 +5797,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5822,7 +5822,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5854,7 +5854,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5878,7 +5878,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5896,7 +5896,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5912,7 +5912,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -5928,7 +5928,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -6070,7 +6070,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -6086,7 +6086,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -6111,7 +6111,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -6151,7 +6151,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -6175,12 +6175,91 @@ "dataset": "urn:li:dataset:(urn:li:dataPlatform:mysql,metagalaxy.metadata_aspect,PROD)", "type": "COPY" } + ], + "fineGrainedLineages": [ + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:mysql,metagalaxy.metadata_aspect,PROD),urn)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.metagalaxy.metadata_aspect,PROD),urn)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:mysql,metagalaxy.metadata_aspect,PROD),createdfor)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.metagalaxy.metadata_aspect,PROD),createdfor)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:mysql,metagalaxy.metadata_aspect,PROD),createdby)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.metagalaxy.metadata_aspect,PROD),createdby)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:mysql,metagalaxy.metadata_aspect,PROD),createdon)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.metagalaxy.metadata_aspect,PROD),createdon)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:mysql,metagalaxy.metadata_aspect,PROD),metadata)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.metagalaxy.metadata_aspect,PROD),metadata)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:mysql,metagalaxy.metadata_aspect,PROD),version)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.metagalaxy.metadata_aspect,PROD),version)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:mysql,metagalaxy.metadata_aspect,PROD),aspect)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.metagalaxy.metadata_aspect,PROD),aspect)" + ], + "confidenceScore": 1.0 + } ] } }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -6204,12 +6283,91 @@ "dataset": "urn:li:dataset:(urn:li:dataPlatform:mysql,metagalaxy.metadata_index,PROD)", "type": "COPY" } + ], + "fineGrainedLineages": [ + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:mysql,metagalaxy.metadata_index,PROD),doubleVal)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.metagalaxy.metadata_index,PROD),doubleVal)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:mysql,metagalaxy.metadata_index,PROD),id)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.metagalaxy.metadata_index,PROD),id)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:mysql,metagalaxy.metadata_index,PROD),urn)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.metagalaxy.metadata_index,PROD),urn)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:mysql,metagalaxy.metadata_index,PROD),aspect)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.metagalaxy.metadata_index,PROD),aspect)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:mysql,metagalaxy.metadata_index,PROD),path)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.metagalaxy.metadata_index,PROD),path)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:mysql,metagalaxy.metadata_index,PROD),longVal)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.metagalaxy.metadata_index,PROD),longVal)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:mysql,metagalaxy.metadata_index,PROD),stringVal)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.metagalaxy.metadata_index,PROD),stringVal)" + ], + "confidenceScore": 1.0 + } ] } }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -6233,12 +6391,58 @@ "dataset": "urn:li:dataset:(urn:li:dataPlatform:mysql,metagalaxy.metadata_index_view,PROD)", "type": "COPY" } + ], + "fineGrainedLineages": [ + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:mysql,metagalaxy.metadata_index_view,PROD),path)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.metagalaxy.metadata_index_view,PROD),path)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:mysql,metagalaxy.metadata_index_view,PROD),id)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.metagalaxy.metadata_index_view,PROD),id)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:mysql,metagalaxy.metadata_index_view,PROD),urn)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.metagalaxy.metadata_index_view,PROD),urn)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:mysql,metagalaxy.metadata_index_view,PROD),doubleVal)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.metagalaxy.metadata_index_view,PROD),doubleVal)" + ], + "confidenceScore": 1.0 + } ] } }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -6262,12 +6466,80 @@ "dataset": "urn:li:dataset:(urn:li:dataPlatform:mysql,northwind.customers,PROD)", "type": "COPY" } + ], + "fineGrainedLineages": [ + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:mysql,northwind.customers,PROD),id)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.northwind.customers,PROD),id)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:mysql,northwind.customers,PROD),company)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.northwind.customers,PROD),company)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:mysql,northwind.customers,PROD),last_name)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.northwind.customers,PROD),last_name)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:mysql,northwind.customers,PROD),first_name)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.northwind.customers,PROD),first_name)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:mysql,northwind.customers,PROD),email_address)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.northwind.customers,PROD),email_address)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:mysql,northwind.customers,PROD),priority)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.northwind.customers,PROD),priority)" + ], + "confidenceScore": 1.0 + } ] } }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -6291,12 +6563,47 @@ "dataset": "urn:li:dataset:(urn:li:dataPlatform:mysql,northwind.orders,PROD)", "type": "COPY" } + ], + "fineGrainedLineages": [ + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:mysql,northwind.orders,PROD),customer_id)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.northwind.orders,PROD),customer_id)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:mysql,northwind.orders,PROD),id)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.northwind.orders,PROD),id)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:mysql,northwind.orders,PROD),description)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.northwind.orders,PROD),description)" + ], + "confidenceScore": 1.0 + } ] } }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -6320,12 +6627,58 @@ "dataset": "urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./warehouse/sample.parquet,PROD)", "type": "COPY" } + ], + "fineGrainedLineages": [ + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./warehouse/sample.parquet,PROD),id)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.s3.warehouse.sample.parquet,PROD),id)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./warehouse/sample.parquet,PROD),name)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.s3.warehouse.sample.parquet,PROD),name)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./warehouse/sample.parquet,PROD),age)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.s3.warehouse.sample.parquet,PROD),age)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./warehouse/sample.parquet,PROD),salary)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.s3.warehouse.sample.parquet,PROD),salary)" + ], + "confidenceScore": 1.0 + } ] } }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -6349,12 +6702,157 @@ "dataset": "urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/Dremio University/googleplaystore.csv,PROD)", "type": "COPY" } + ], + "fineGrainedLineages": [ + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/Dremio University/googleplaystore.csv,PROD),A)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.dremio university.googleplaystore.csv,PROD),A)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/Dremio University/googleplaystore.csv,PROD),B)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.dremio university.googleplaystore.csv,PROD),B)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/Dremio University/googleplaystore.csv,PROD),C)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.dremio university.googleplaystore.csv,PROD),C)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/Dremio University/googleplaystore.csv,PROD),D)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.dremio university.googleplaystore.csv,PROD),D)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/Dremio University/googleplaystore.csv,PROD),E)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.dremio university.googleplaystore.csv,PROD),E)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/Dremio University/googleplaystore.csv,PROD),F)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.dremio university.googleplaystore.csv,PROD),F)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/Dremio University/googleplaystore.csv,PROD),G)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.dremio university.googleplaystore.csv,PROD),G)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/Dremio University/googleplaystore.csv,PROD),H)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.dremio university.googleplaystore.csv,PROD),H)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/Dremio University/googleplaystore.csv,PROD),I)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.dremio university.googleplaystore.csv,PROD),I)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/Dremio University/googleplaystore.csv,PROD),J)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.dremio university.googleplaystore.csv,PROD),J)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/Dremio University/googleplaystore.csv,PROD),K)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.dremio university.googleplaystore.csv,PROD),K)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/Dremio University/googleplaystore.csv,PROD),L)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.dremio university.googleplaystore.csv,PROD),L)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/Dremio University/googleplaystore.csv,PROD),M)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.dremio university.googleplaystore.csv,PROD),M)" + ], + "confidenceScore": 1.0 + } ] } }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -6378,12 +6876,58 @@ "dataset": "urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/Dremio University/oracle-departments.xlsx,PROD)", "type": "COPY" } + ], + "fineGrainedLineages": [ + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/Dremio University/oracle-departments.xlsx,PROD),DEPARTMENT_NAME)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.dremio university.oracle-departments.xlsx,PROD),DEPARTMENT_NAME)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/Dremio University/oracle-departments.xlsx,PROD),MANAGER_ID)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.dremio university.oracle-departments.xlsx,PROD),MANAGER_ID)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/Dremio University/oracle-departments.xlsx,PROD),DEPARTMENT_ID)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.dremio university.oracle-departments.xlsx,PROD),DEPARTMENT_ID)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/Dremio University/oracle-departments.xlsx,PROD),LOCATION_ID)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.dremio university.oracle-departments.xlsx,PROD),LOCATION_ID)" + ], + "confidenceScore": 1.0 + } ] } }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -6407,12 +6951,113 @@ "dataset": "urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/NYC-weather.csv,PROD)", "type": "COPY" } + ], + "fineGrainedLineages": [ + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/NYC-weather.csv,PROD),F)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.nyc-weather.csv,PROD),F)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/NYC-weather.csv,PROD),G)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.nyc-weather.csv,PROD),G)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/NYC-weather.csv,PROD),H)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.nyc-weather.csv,PROD),H)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/NYC-weather.csv,PROD),I)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.nyc-weather.csv,PROD),I)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/NYC-weather.csv,PROD),A)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.nyc-weather.csv,PROD),A)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/NYC-weather.csv,PROD),B)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.nyc-weather.csv,PROD),B)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/NYC-weather.csv,PROD),C)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.nyc-weather.csv,PROD),C)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/NYC-weather.csv,PROD),D)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.nyc-weather.csv,PROD),D)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/NYC-weather.csv,PROD),E)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.nyc-weather.csv,PROD),E)" + ], + "confidenceScore": 1.0 + } ] } }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -6436,18 +7081,119 @@ "dataset": "urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/tpcds_sf1000/catalog_page/1ab266d5-18eb-4780-711d-0fa337fa6c00/0_0_0.parquet,PROD)", "type": "COPY" } + ], + "fineGrainedLineages": [ + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/tpcds_sf1000/catalog_page/1ab266d5-18eb-4780-711d-0fa337fa6c00/0_0_0.parquet,PROD),cp_start_date_sk)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.tpcds_sf1000.catalog_page.1ab266d5-18eb-4780-711d-0fa337fa6c00.0_0_0.parquet,PROD),cp_start_date_sk)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/tpcds_sf1000/catalog_page/1ab266d5-18eb-4780-711d-0fa337fa6c00/0_0_0.parquet,PROD),cp_catalog_page_sk)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.tpcds_sf1000.catalog_page.1ab266d5-18eb-4780-711d-0fa337fa6c00.0_0_0.parquet,PROD),cp_catalog_page_sk)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/tpcds_sf1000/catalog_page/1ab266d5-18eb-4780-711d-0fa337fa6c00/0_0_0.parquet,PROD),cp_catalog_page_id)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.tpcds_sf1000.catalog_page.1ab266d5-18eb-4780-711d-0fa337fa6c00.0_0_0.parquet,PROD),cp_catalog_page_id)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/tpcds_sf1000/catalog_page/1ab266d5-18eb-4780-711d-0fa337fa6c00/0_0_0.parquet,PROD),cp_end_date_sk)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.tpcds_sf1000.catalog_page.1ab266d5-18eb-4780-711d-0fa337fa6c00.0_0_0.parquet,PROD),cp_end_date_sk)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/tpcds_sf1000/catalog_page/1ab266d5-18eb-4780-711d-0fa337fa6c00/0_0_0.parquet,PROD),cp_department)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.tpcds_sf1000.catalog_page.1ab266d5-18eb-4780-711d-0fa337fa6c00.0_0_0.parquet,PROD),cp_department)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/tpcds_sf1000/catalog_page/1ab266d5-18eb-4780-711d-0fa337fa6c00/0_0_0.parquet,PROD),cp_catalog_number)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.tpcds_sf1000.catalog_page.1ab266d5-18eb-4780-711d-0fa337fa6c00.0_0_0.parquet,PROD),cp_catalog_number)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/tpcds_sf1000/catalog_page/1ab266d5-18eb-4780-711d-0fa337fa6c00/0_0_0.parquet,PROD),cp_catalog_page_number)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.tpcds_sf1000.catalog_page.1ab266d5-18eb-4780-711d-0fa337fa6c00.0_0_0.parquet,PROD),cp_catalog_page_number)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/tpcds_sf1000/catalog_page/1ab266d5-18eb-4780-711d-0fa337fa6c00/0_0_0.parquet,PROD),cp_description)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.tpcds_sf1000.catalog_page.1ab266d5-18eb-4780-711d-0fa337fa6c00.0_0_0.parquet,PROD),cp_description)" + ], + "confidenceScore": 1.0 + }, + { + "upstreamType": "FIELD_SET", + "upstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:s3,s3_test_samples./samples.dremio.com/tpcds_sf1000/catalog_page/1ab266d5-18eb-4780-711d-0fa337fa6c00/0_0_0.parquet,PROD),cp_type)" + ], + "downstreamType": "FIELD", + "downstreams": [ + "urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.tpcds_sf1000.catalog_page.1ab266d5-18eb-4780-711d-0fa337fa6c00.0_0_0.parquet,PROD),cp_type)" + ], + "confidenceScore": 1.0 + } ] } }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.space.test_folder.customers,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.nyc-weather.csv,PROD)", "changeType": "UPSERT", "aspectName": "datasetProfile", "aspect": { @@ -6457,41 +7203,52 @@ "partition": "FULL_TABLE_SNAPSHOT", "type": "FULL_TABLE" }, - "rowCount": 5, - "columnCount": 6, + "rowCount": 3834, + "columnCount": 9, "fieldProfiles": [ { - "fieldPath": "id", - "uniqueCount": 5, - "nullCount": 0, - "mean": "3.0", - "stdev": "1.5811388300841898" + "fieldPath": "F", + "uniqueCount": 61, + "nullCount": 0 }, { - "fieldPath": "company", - "uniqueCount": 5, + "fieldPath": "G", + "uniqueCount": 40, "nullCount": 0 }, { - "fieldPath": "last_name", - "uniqueCount": 5, + "fieldPath": "H", + "uniqueCount": 91, "nullCount": 0 }, { - "fieldPath": "first_name", - "uniqueCount": 5, + "fieldPath": "I", + "uniqueCount": 85, "nullCount": 0 }, { - "fieldPath": "priority", - "uniqueCount": 3, - "nullCount": 1, - "mean": "4.175000011920929", - "stdev": "0.4924429489953036" + "fieldPath": "A", + "uniqueCount": 2, + "nullCount": 0 }, { - "fieldPath": "email_address", - "uniqueCount": 5, + "fieldPath": "B", + "uniqueCount": 2, + "nullCount": 0 + }, + { + "fieldPath": "C", + "uniqueCount": 3834, + "nullCount": 0 + }, + { + "fieldPath": "D", + "uniqueCount": 76, + "nullCount": 0 + }, + { + "fieldPath": "E", + "uniqueCount": 192, "nullCount": 0 } ] @@ -6499,13 +7256,13 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.space.test_folder.metadata_index,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.metagalaxy.metadata_index_view,PROD)", "changeType": "UPSERT", "aspectName": "datasetProfile", "aspect": { @@ -6516,7 +7273,7 @@ "type": "FULL_TABLE" }, "rowCount": 0, - "columnCount": 7, + "columnCount": 4, "fieldProfiles": [ { "fieldPath": "path", @@ -6524,7 +7281,7 @@ "nullCount": 0 }, { - "fieldPath": "aspect", + "fieldPath": "id", "uniqueCount": 0, "nullCount": 0 }, @@ -6533,38 +7290,23 @@ "uniqueCount": 0, "nullCount": 0 }, - { - "fieldPath": "id", - "uniqueCount": 0, - "nullCount": 0 - }, { "fieldPath": "doubleVal", "uniqueCount": 0, "nullCount": 0 - }, - { - "fieldPath": "stringVal", - "uniqueCount": 0, - "nullCount": 0 - }, - { - "fieldPath": "longVal", - "uniqueCount": 0, - "nullCount": 0 } ] } }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.northwind.orders,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.metagalaxy.metadata_index,PROD)", "changeType": "UPSERT", "aspectName": "datasetProfile", "aspect": { @@ -6575,20 +7317,40 @@ "type": "FULL_TABLE" }, "rowCount": 0, - "columnCount": 3, + "columnCount": 7, "fieldProfiles": [ + { + "fieldPath": "doubleVal", + "uniqueCount": 0, + "nullCount": 0 + }, { "fieldPath": "id", "uniqueCount": 0, "nullCount": 0 }, { - "fieldPath": "description", + "fieldPath": "urn", "uniqueCount": 0, "nullCount": 0 }, { - "fieldPath": "customer_id", + "fieldPath": "aspect", + "uniqueCount": 0, + "nullCount": 0 + }, + { + "fieldPath": "path", + "uniqueCount": 0, + "nullCount": 0 + }, + { + "fieldPath": "longVal", + "uniqueCount": 0, + "nullCount": 0 + }, + { + "fieldPath": "stringVal", "uniqueCount": 0, "nullCount": 0 } @@ -6597,13 +7359,13 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.space.test_folder.orders,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.northwind.orders,PROD)", "changeType": "UPSERT", "aspectName": "datasetProfile", "aspect": { @@ -6617,17 +7379,17 @@ "columnCount": 3, "fieldProfiles": [ { - "fieldPath": "id", + "fieldPath": "customer_id", "uniqueCount": 0, "nullCount": 0 }, { - "fieldPath": "description", + "fieldPath": "id", "uniqueCount": 0, "nullCount": 0 }, { - "fieldPath": "customer_id", + "fieldPath": "description", "uniqueCount": 0, "nullCount": 0 } @@ -6636,13 +7398,13 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.s3.warehouse.sample.parquet,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.space.test_folder.raw,PROD)", "changeType": "UPSERT", "aspectName": "datasetProfile", "aspect": { @@ -6656,16 +7418,11 @@ "columnCount": 4, "fieldProfiles": [ { - "fieldPath": "id", + "fieldPath": "salary", "uniqueCount": 4, "nullCount": 0, - "mean": "2.5", - "stdev": "1.2909944487358056" - }, - { - "fieldPath": "name", - "uniqueCount": 4, - "nullCount": 0 + "mean": "65000.0", + "stdev": "12909.944487358056" }, { "fieldPath": "age", @@ -6675,24 +7432,29 @@ "stdev": "6.454972243679028" }, { - "fieldPath": "salary", + "fieldPath": "name", + "uniqueCount": 4, + "nullCount": 0 + }, + { + "fieldPath": "id", "uniqueCount": 4, "nullCount": 0, - "mean": "65000.0", - "stdev": "12909.944487358056" + "mean": "2.5", + "stdev": "1.2909944487358056" } ] } }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.space.warehouse,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.space.test_folder.metadata_index_view,PROD)", "changeType": "UPSERT", "aspectName": "datasetProfile", "aspect": { @@ -6702,52 +7464,27 @@ "partition": "FULL_TABLE_SNAPSHOT", "type": "FULL_TABLE" }, - "rowCount": 3834, - "columnCount": 9, + "rowCount": 0, + "columnCount": 4, "fieldProfiles": [ { - "fieldPath": "A", - "uniqueCount": 2, - "nullCount": 0 - }, - { - "fieldPath": "I", - "uniqueCount": 85, - "nullCount": 0 - }, - { - "fieldPath": "H", - "uniqueCount": 91, - "nullCount": 0 - }, - { - "fieldPath": "G", - "uniqueCount": 40, - "nullCount": 0 - }, - { - "fieldPath": "F", - "uniqueCount": 61, - "nullCount": 0 - }, - { - "fieldPath": "E", - "uniqueCount": 192, + "fieldPath": "id", + "uniqueCount": 0, "nullCount": 0 }, { - "fieldPath": "D", - "uniqueCount": 76, + "fieldPath": "urn", + "uniqueCount": 0, "nullCount": 0 }, { - "fieldPath": "C", - "uniqueCount": 3834, + "fieldPath": "path", + "uniqueCount": 0, "nullCount": 0 }, { - "fieldPath": "B", - "uniqueCount": 2, + "fieldPath": "doubleVal", + "uniqueCount": 0, "nullCount": 0 } ] @@ -6755,13 +7492,13 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.metagalaxy.metadata_index_view,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.space.test_folder.customers,PROD)", "changeType": "UPSERT", "aspectName": "datasetProfile", "aspect": { @@ -6771,27 +7508,41 @@ "partition": "FULL_TABLE_SNAPSHOT", "type": "FULL_TABLE" }, - "rowCount": 0, - "columnCount": 4, + "rowCount": 5, + "columnCount": 6, "fieldProfiles": [ { - "fieldPath": "path", - "uniqueCount": 0, + "fieldPath": "email_address", + "uniqueCount": 5, "nullCount": 0 }, { - "fieldPath": "doubleVal", - "uniqueCount": 0, + "fieldPath": "priority", + "uniqueCount": 3, + "nullCount": 1, + "mean": "4.175000011920929", + "stdev": "0.4924429489953036" + }, + { + "fieldPath": "company", + "uniqueCount": 5, "nullCount": 0 }, { "fieldPath": "id", - "uniqueCount": 0, + "uniqueCount": 5, + "nullCount": 0, + "mean": "3.0", + "stdev": "1.5811388300841898" + }, + { + "fieldPath": "first_name", + "uniqueCount": 5, "nullCount": 0 }, { - "fieldPath": "urn", - "uniqueCount": 0, + "fieldPath": "last_name", + "uniqueCount": 5, "nullCount": 0 } ] @@ -6799,13 +7550,13 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.northwind.customers,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.space.warehouse,PROD)", "changeType": "UPSERT", "aspectName": "datasetProfile", "aspect": { @@ -6815,55 +7566,66 @@ "partition": "FULL_TABLE_SNAPSHOT", "type": "FULL_TABLE" }, - "rowCount": 5, - "columnCount": 6, + "rowCount": 3834, + "columnCount": 9, "fieldProfiles": [ { - "fieldPath": "id", - "uniqueCount": 5, - "nullCount": 0, - "mean": "3.0", - "stdev": "1.5811388300841898" + "fieldPath": "F", + "uniqueCount": 61, + "nullCount": 0 }, { - "fieldPath": "company", - "uniqueCount": 5, + "fieldPath": "G", + "uniqueCount": 40, "nullCount": 0 }, { - "fieldPath": "last_name", - "uniqueCount": 5, + "fieldPath": "H", + "uniqueCount": 91, "nullCount": 0 }, { - "fieldPath": "first_name", - "uniqueCount": 5, + "fieldPath": "I", + "uniqueCount": 85, "nullCount": 0 }, { - "fieldPath": "email_address", - "uniqueCount": 5, + "fieldPath": "A", + "uniqueCount": 2, "nullCount": 0 }, { - "fieldPath": "priority", - "uniqueCount": 3, - "nullCount": 1, - "mean": "4.175000011920929", - "stdev": "0.4924429489953036" + "fieldPath": "B", + "uniqueCount": 2, + "nullCount": 0 + }, + { + "fieldPath": "C", + "uniqueCount": 3834, + "nullCount": 0 + }, + { + "fieldPath": "D", + "uniqueCount": 76, + "nullCount": 0 + }, + { + "fieldPath": "E", + "uniqueCount": 192, + "nullCount": 0 } ] } }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.metagalaxy.metadata_index,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.space.test_folder.metadata_aspect,PROD)", "changeType": "UPSERT", "aspectName": "datasetProfile", "aspect": { @@ -6873,42 +7635,42 @@ "partition": "FULL_TABLE_SNAPSHOT", "type": "FULL_TABLE" }, - "rowCount": 0, + "rowCount": 2, "columnCount": 7, "fieldProfiles": [ { - "fieldPath": "doubleVal", - "uniqueCount": 0, + "fieldPath": "createdby", + "uniqueCount": 1, "nullCount": 0 }, { - "fieldPath": "id", + "fieldPath": "createdfor", "uniqueCount": 0, - "nullCount": 0 + "nullCount": 2 }, { "fieldPath": "urn", - "uniqueCount": 0, + "uniqueCount": 1, "nullCount": 0 }, { "fieldPath": "aspect", - "uniqueCount": 0, + "uniqueCount": 2, "nullCount": 0 }, { - "fieldPath": "path", - "uniqueCount": 0, + "fieldPath": "version", + "uniqueCount": 1, "nullCount": 0 }, { - "fieldPath": "longVal", - "uniqueCount": 0, + "fieldPath": "metadata", + "uniqueCount": 2, "nullCount": 0 }, { - "fieldPath": "stringVal", - "uniqueCount": 0, + "fieldPath": "createdon", + "uniqueCount": 1, "nullCount": 0 } ] @@ -6916,13 +7678,13 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.space.test_folder.raw,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.metagalaxy.metadata_aspect,PROD)", "changeType": "UPSERT", "aspectName": "datasetProfile", "aspect": { @@ -6932,47 +7694,56 @@ "partition": "FULL_TABLE_SNAPSHOT", "type": "FULL_TABLE" }, - "rowCount": 4, - "columnCount": 4, + "rowCount": 2, + "columnCount": 7, "fieldProfiles": [ { - "fieldPath": "id", - "uniqueCount": 4, - "nullCount": 0, - "mean": "2.5", - "stdev": "1.2909944487358056" + "fieldPath": "urn", + "uniqueCount": 1, + "nullCount": 0 }, { - "fieldPath": "name", - "uniqueCount": 4, + "fieldPath": "createdfor", + "uniqueCount": 0, + "nullCount": 2 + }, + { + "fieldPath": "createdby", + "uniqueCount": 1, "nullCount": 0 }, { - "fieldPath": "age", - "uniqueCount": 4, - "nullCount": 0, - "mean": "32.5", - "stdev": "6.454972243679028" + "fieldPath": "createdon", + "uniqueCount": 1, + "nullCount": 0 }, { - "fieldPath": "salary", - "uniqueCount": 4, - "nullCount": 0, - "mean": "65000.0", - "stdev": "12909.944487358056" + "fieldPath": "metadata", + "uniqueCount": 2, + "nullCount": 0 + }, + { + "fieldPath": "version", + "uniqueCount": 1, + "nullCount": 0 + }, + { + "fieldPath": "aspect", + "uniqueCount": 2, + "nullCount": 0 } ] } }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.dremio university.googleplaystore.csv,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.s3.warehouse.sample.parquet,PROD)", "changeType": "UPSERT", "aspectName": "datasetProfile", "aspect": { @@ -6982,86 +7753,47 @@ "partition": "FULL_TABLE_SNAPSHOT", "type": "FULL_TABLE" }, - "rowCount": 10842, - "columnCount": 13, + "rowCount": 4, + "columnCount": 4, "fieldProfiles": [ { - "fieldPath": "I", - "uniqueCount": 8, - "nullCount": 0 - }, - { - "fieldPath": "A", - "uniqueCount": 9661, - "nullCount": 0 - }, - { - "fieldPath": "B", - "uniqueCount": 35, - "nullCount": 0 - }, - { - "fieldPath": "C", - "uniqueCount": 42, - "nullCount": 0 - }, - { - "fieldPath": "D", - "uniqueCount": 6003, - "nullCount": 0 - }, - { - "fieldPath": "E", - "uniqueCount": 463, - "nullCount": 0 - }, - { - "fieldPath": "F", - "uniqueCount": 23, - "nullCount": 0 - }, - { - "fieldPath": "G", - "uniqueCount": 5, - "nullCount": 0 - }, - { - "fieldPath": "H", - "uniqueCount": 94, - "nullCount": 0 - }, - { - "fieldPath": "J", - "uniqueCount": 121, - "nullCount": 0 + "fieldPath": "id", + "uniqueCount": 4, + "nullCount": 0, + "mean": "2.5", + "stdev": "1.2909944487358056" }, { - "fieldPath": "K", - "uniqueCount": 1379, + "fieldPath": "name", + "uniqueCount": 4, "nullCount": 0 }, { - "fieldPath": "L", - "uniqueCount": 2835, - "nullCount": 0 + "fieldPath": "age", + "uniqueCount": 4, + "nullCount": 0, + "mean": "32.5", + "stdev": "6.454972243679028" }, { - "fieldPath": "M", - "uniqueCount": 35, - "nullCount": 1 + "fieldPath": "salary", + "uniqueCount": 4, + "nullCount": 0, + "mean": "65000.0", + "stdev": "12909.944487358056" } ] } }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.space.test_folder.metadata_index_view,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.space.test_folder.orders,PROD)", "changeType": "UPSERT", "aspectName": "datasetProfile", "aspect": { @@ -7072,20 +7804,15 @@ "type": "FULL_TABLE" }, "rowCount": 0, - "columnCount": 4, + "columnCount": 3, "fieldProfiles": [ { - "fieldPath": "doubleVal", - "uniqueCount": 0, - "nullCount": 0 - }, - { - "fieldPath": "path", + "fieldPath": "customer_id", "uniqueCount": 0, "nullCount": 0 }, { - "fieldPath": "urn", + "fieldPath": "description", "uniqueCount": 0, "nullCount": 0 }, @@ -7099,13 +7826,13 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.nyc-weather.csv,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.space.test_folder.metadata_index,PROD)", "changeType": "UPSERT", "aspectName": "datasetProfile", "aspect": { @@ -7115,52 +7842,42 @@ "partition": "FULL_TABLE_SNAPSHOT", "type": "FULL_TABLE" }, - "rowCount": 3834, - "columnCount": 9, + "rowCount": 0, + "columnCount": 7, "fieldProfiles": [ { - "fieldPath": "B", - "uniqueCount": 2, - "nullCount": 0 - }, - { - "fieldPath": "C", - "uniqueCount": 3834, - "nullCount": 0 - }, - { - "fieldPath": "D", - "uniqueCount": 76, + "fieldPath": "id", + "uniqueCount": 0, "nullCount": 0 }, { - "fieldPath": "E", - "uniqueCount": 192, + "fieldPath": "urn", + "uniqueCount": 0, "nullCount": 0 }, { - "fieldPath": "F", - "uniqueCount": 61, + "fieldPath": "longVal", + "uniqueCount": 0, "nullCount": 0 }, { - "fieldPath": "G", - "uniqueCount": 40, + "fieldPath": "stringVal", + "uniqueCount": 0, "nullCount": 0 }, { - "fieldPath": "H", - "uniqueCount": 91, + "fieldPath": "doubleVal", + "uniqueCount": 0, "nullCount": 0 }, { - "fieldPath": "I", - "uniqueCount": 85, + "fieldPath": "path", + "uniqueCount": 0, "nullCount": 0 }, { - "fieldPath": "A", - "uniqueCount": 2, + "fieldPath": "aspect", + "uniqueCount": 0, "nullCount": 0 } ] @@ -7168,13 +7885,13 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.space.test_folder.metadata_aspect,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.northwind.customers,PROD)", "changeType": "UPSERT", "aspectName": "datasetProfile", "aspect": { @@ -7184,56 +7901,55 @@ "partition": "FULL_TABLE_SNAPSHOT", "type": "FULL_TABLE" }, - "rowCount": 2, - "columnCount": 7, + "rowCount": 5, + "columnCount": 6, "fieldProfiles": [ { - "fieldPath": "urn", - "uniqueCount": 1, - "nullCount": 0 - }, - { - "fieldPath": "aspect", - "uniqueCount": 2, - "nullCount": 0 + "fieldPath": "id", + "uniqueCount": 5, + "nullCount": 0, + "mean": "3.0", + "stdev": "1.5811388300841898" }, { - "fieldPath": "version", - "uniqueCount": 1, + "fieldPath": "company", + "uniqueCount": 5, "nullCount": 0 }, { - "fieldPath": "metadata", - "uniqueCount": 2, + "fieldPath": "last_name", + "uniqueCount": 5, "nullCount": 0 }, { - "fieldPath": "createdon", - "uniqueCount": 1, + "fieldPath": "first_name", + "uniqueCount": 5, "nullCount": 0 }, { - "fieldPath": "createdby", - "uniqueCount": 1, + "fieldPath": "email_address", + "uniqueCount": 5, "nullCount": 0 }, { - "fieldPath": "createdfor", - "uniqueCount": 0, - "nullCount": 2 + "fieldPath": "priority", + "uniqueCount": 3, + "nullCount": 1, + "mean": "4.175000011920929", + "stdev": "0.4924429489953036" } ] } }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, { "entityType": "dataset", - "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.mysql.metagalaxy.metadata_aspect,PROD)", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:dremio,dremio.samples.samples.dremio.com.dremio university.googleplaystore.csv,PROD)", "changeType": "UPSERT", "aspectName": "datasetProfile", "aspect": { @@ -7243,50 +7959,80 @@ "partition": "FULL_TABLE_SNAPSHOT", "type": "FULL_TABLE" }, - "rowCount": 2, - "columnCount": 7, + "rowCount": 10842, + "columnCount": 13, "fieldProfiles": [ { - "fieldPath": "urn", - "uniqueCount": 1, + "fieldPath": "A", + "uniqueCount": 9661, "nullCount": 0 }, { - "fieldPath": "aspect", - "uniqueCount": 2, + "fieldPath": "B", + "uniqueCount": 35, "nullCount": 0 }, { - "fieldPath": "version", - "uniqueCount": 1, + "fieldPath": "C", + "uniqueCount": 42, "nullCount": 0 }, { - "fieldPath": "metadata", - "uniqueCount": 2, + "fieldPath": "D", + "uniqueCount": 6003, "nullCount": 0 }, { - "fieldPath": "createdon", - "uniqueCount": 1, + "fieldPath": "E", + "uniqueCount": 463, "nullCount": 0 }, { - "fieldPath": "createdby", - "uniqueCount": 1, + "fieldPath": "F", + "uniqueCount": 23, "nullCount": 0 }, { - "fieldPath": "createdfor", - "uniqueCount": 0, - "nullCount": 2 + "fieldPath": "G", + "uniqueCount": 5, + "nullCount": 0 + }, + { + "fieldPath": "H", + "uniqueCount": 94, + "nullCount": 0 + }, + { + "fieldPath": "I", + "uniqueCount": 8, + "nullCount": 0 + }, + { + "fieldPath": "J", + "uniqueCount": 121, + "nullCount": 0 + }, + { + "fieldPath": "K", + "uniqueCount": 1379, + "nullCount": 0 + }, + { + "fieldPath": "L", + "uniqueCount": 2835, + "nullCount": 0 + }, + { + "fieldPath": "M", + "uniqueCount": 35, + "nullCount": 1 } ] } }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -7336,7 +8082,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } }, @@ -7415,7 +8161,7 @@ }, "systemMetadata": { "lastObserved": 1697353200000, - "runId": "dremio-2023_10_15-07_00_00-7c7cnk", + "runId": "dremio-2023_10_15-07_00_00-bo12f3", "lastRunId": "no-run-id-provided" } } diff --git a/metadata-ingestion/tests/test_helpers/mce_helpers.py b/metadata-ingestion/tests/test_helpers/mce_helpers.py index f4c629df7dba4e..0105e6d596970b 100644 --- a/metadata-ingestion/tests/test_helpers/mce_helpers.py +++ b/metadata-ingestion/tests/test_helpers/mce_helpers.py @@ -323,7 +323,7 @@ def assert_entity_mce_aspect( ) -> int: # TODO: Replace with read_metadata_file() test_output = load_json_file(file) - entity_type = Urn.create_from_string(entity_urn).get_type() + entity_type = Urn.from_string(entity_urn).get_type() assert isinstance(test_output, list) # mce urns mces: List[MetadataChangeEventClass] = [ @@ -346,7 +346,7 @@ def assert_entity_mcp_aspect( ) -> int: # TODO: Replace with read_metadata_file() test_output = load_json_file(file) - entity_type = Urn.create_from_string(entity_urn).get_type() + entity_type = Urn.from_string(entity_urn).get_type() assert isinstance(test_output, list) # mcps that match entity_urn mcps: List[MetadataChangeProposalWrapper] = [ diff --git a/metadata-ingestion/tests/unit/test_generic_aspect_transformer.py b/metadata-ingestion/tests/unit/test_generic_aspect_transformer.py index 18b0d9fd400412..52d7aa7f509c9e 100644 --- a/metadata-ingestion/tests/unit/test_generic_aspect_transformer.py +++ b/metadata-ingestion/tests/unit/test_generic_aspect_transformer.py @@ -51,7 +51,7 @@ def make_mcpw( ) -> MetadataChangeProposalWrapper: return MetadataChangeProposalWrapper( entityUrn=entity_urn, - entityType=Urn.create_from_string(entity_urn).get_type(), + entityType=Urn.from_string(entity_urn).get_type(), aspectName=aspect_name, changeType="UPSERT", aspect=aspect, @@ -65,7 +65,7 @@ def make_mcpc( ) -> MetadataChangeProposalClass: return MetadataChangeProposalClass( entityUrn=entity_urn, - entityType=Urn.create_from_string(entity_urn).get_type(), + entityType=Urn.from_string(entity_urn).get_type(), aspectName=aspect_name, changeType="UPSERT", aspect=aspect, diff --git a/metadata-ingestion/tests/unit/test_neo4j_source.py b/metadata-ingestion/tests/unit/test_neo4j_source.py new file mode 100644 index 00000000000000..62586718e86067 --- /dev/null +++ b/metadata-ingestion/tests/unit/test_neo4j_source.py @@ -0,0 +1,221 @@ +import unittest +from pathlib import Path + +import pandas as pd +import pytest + +from datahub.ingestion.api.common import PipelineContext +from datahub.ingestion.source.neo4j.neo4j_source import Neo4jConfig, Neo4jSource + + +@pytest.fixture +def tracking_uri(tmp_path: Path) -> str: + # return str(tmp_path / "neo4j") + return "neo4j+ssc://host:7687" + + +@pytest.fixture +def source(tracking_uri: str) -> Neo4jSource: + return Neo4jSource( + ctx=PipelineContext(run_id="neo4j-test"), + config=Neo4jConfig( + uri=tracking_uri, env="Prod", username="test", password="test" + ), + ) + + +def data(): + return [ + { + "key": "Node_1", + "value": { + "count": 433026, + "relationships": { + "RELATIONSHIP_1": { + "count": 1, + "properties": { + "Relationship1_Property1": { + "existence": False, + "type": "STRING", + "indexed": False, + "array": False, + } + }, + "direction": "in", + "labels": ["Node_2"], + } + }, + "RELATIONSHIP_2": { + "count": 2, + "properties": { + "Relationship2_Property1": { + "existence": False, + "type": "STRING", + "indexed": False, + "array": False, + } + }, + "direction": "in", + "labels": ["Node_3"], + }, + "type": "node", + "properties": { + "Node1_Property1": { + "existence": False, + "type": "DATE", + "indexed": False, + "unique": False, + }, + "Node1_Property2": { + "existence": False, + "type": "STRING", + "indexed": False, + "unique": False, + }, + "Node1_Property3": { + "existence": False, + "type": "STRING", + "indexed": False, + "unique": False, + }, + }, + "labels": [], + }, + }, + { + "key": "Node_2", + "value": { + "count": 3, + "relationships": { + "RELATIONSHIP_1": { + "count": 1, + "properties": { + "Relationship1_Property1": { + "existence": False, + "type": "STRING", + "indexed": False, + "array": False, + } + }, + "direction": "out", + "labels": ["Node_2"], + } + }, + "type": "node", + "properties": { + "Node2_Property1": { + "existence": False, + "type": "DATE", + "indexed": False, + "unique": False, + }, + "Node2_Property2": { + "existence": False, + "type": "STRING", + "indexed": False, + "unique": False, + }, + "Node2_Property3": { + "existence": False, + "type": "STRING", + "indexed": False, + "unique": False, + }, + }, + "labels": [], + }, + }, + { + "key": "RELATIONSHIP_1", + "value": { + "count": 4, + "type": "relationship", + "properties": { + "Relationship1_Property1": { + "existence": False, + "type": "STRING", + "indexed": False, + "array": False, + } + }, + }, + }, + ] + + +def test_process_nodes(source): + df = source.process_nodes(data=data()) + assert type(df) is pd.DataFrame + + +def test_process_relationships(source): + df = source.process_relationships( + data=data(), node_df=source.process_nodes(data=data()) + ) + assert type(df) is pd.DataFrame + + +def test_get_obj_type(source): + results = data() + assert source.get_obj_type(results[0]["value"]) == "node" + assert source.get_obj_type(results[1]["value"]) == "node" + assert source.get_obj_type(results[2]["value"]) == "relationship" + + +def test_get_node_description(source): + results = data() + df = source.process_nodes(data=data()) + assert ( + source.get_node_description(results[0], df) + == "(Node_1)<-[RELATIONSHIP_1]-(Node_2)" + ) + assert ( + source.get_node_description(results[1], df) + == "(Node_2)-[RELATIONSHIP_1]->(Node_2)" + ) + + +def test_get_property_data_types(source): + results = data() + assert source.get_property_data_types(results[0]["value"]["properties"]) == [ + {"Node1_Property1": "DATE"}, + {"Node1_Property2": "STRING"}, + {"Node1_Property3": "STRING"}, + ] + assert source.get_property_data_types(results[1]["value"]["properties"]) == [ + {"Node2_Property1": "DATE"}, + {"Node2_Property2": "STRING"}, + {"Node2_Property3": "STRING"}, + ] + assert source.get_property_data_types(results[2]["value"]["properties"]) == [ + {"Relationship1_Property1": "STRING"} + ] + + +def test_get_properties(source): + results = data() + assert list(source.get_properties(results[0]["value"]).keys()) == [ + "Node1_Property1", + "Node1_Property2", + "Node1_Property3", + ] + assert list(source.get_properties(results[1]["value"]).keys()) == [ + "Node2_Property1", + "Node2_Property2", + "Node2_Property3", + ] + assert list(source.get_properties(results[2]["value"]).keys()) == [ + "Relationship1_Property1" + ] + + +def test_get_relationships(source): + results = data() + record = list( + results[0]["value"]["relationships"].keys() + ) # Get the first key from the dict_keys + assert record == ["RELATIONSHIP_1"] + + +if __name__ == "__main__": + unittest.main() diff --git a/metadata-ingestion/tests/unit/test_transform_dataset.py b/metadata-ingestion/tests/unit/test_transform_dataset.py index 389f7b70b3311e..5151be9c8b1997 100644 --- a/metadata-ingestion/tests/unit/test_transform_dataset.py +++ b/metadata-ingestion/tests/unit/test_transform_dataset.py @@ -122,7 +122,7 @@ def make_generic_dataset_mcp( ) -> MetadataChangeProposalWrapper: return MetadataChangeProposalWrapper( entityUrn=entity_urn, - entityType=Urn.create_from_string(entity_urn).get_type(), + entityType=Urn.from_string(entity_urn).get_type(), aspectName=aspect_name, changeType="UPSERT", aspect=aspect, @@ -138,7 +138,7 @@ def make_generic_container_mcp( aspect = models.StatusClass(removed=False) return MetadataChangeProposalWrapper( entityUrn=entity_urn, - entityType=Urn.create_from_string(entity_urn).get_type(), + entityType=Urn.from_string(entity_urn).get_type(), aspectName=aspect_name, changeType="UPSERT", aspect=aspect, diff --git a/metadata-integration/java/acryl-spark-lineage/README.md b/metadata-integration/java/acryl-spark-lineage/README.md index 267e979b0fa073..97851e90e860ed 100644 --- a/metadata-integration/java/acryl-spark-lineage/README.md +++ b/metadata-integration/java/acryl-spark-lineage/README.md @@ -125,9 +125,10 @@ information like tokens. configurations under `Spark Config`. ```text - spark.extraListeners datahub.spark.DatahubSparkListener - spark.datahub.rest.server http://localhost:8080 - spark.datahub.databricks.cluster cluster-name + spark.extraListeners datahub.spark.DatahubSparkListener + spark.datahub.rest.server http://localhost:8080 + spark.datahub.stage_metadata_coalescing true + spark.datahub.databricks.cluster cluster-name ``` - Click the **Init Scripts** tab. Set cluster init script as `dbfs:/datahub/init.sh`. diff --git a/metadata-service/configuration/src/main/resources/bootstrap_mcps/data-platforms.yaml b/metadata-service/configuration/src/main/resources/bootstrap_mcps/data-platforms.yaml index 1625df4a99540d..0b3d815c710980 100644 --- a/metadata-service/configuration/src/main/resources/bootstrap_mcps/data-platforms.yaml +++ b/metadata-service/configuration/src/main/resources/bootstrap_mcps/data-platforms.yaml @@ -727,3 +727,14 @@ displayName: Cassandra type: KEY_VALUE_STORE logoUrl: "/assets/platforms/cassandralogo.png" +- entityUrn: urn:li:dataPlatform:neo4j + entityType: dataPlatform + aspectName: dataPlatformInfo + changeType: UPSERT + aspect: + datasetNameDelimiter: "." + name: neo4j + displayName: Neo4j + type: OTHERS + logoUrl: "/assets/platforms/neo4j.png" +