mirror of
https://github.com/datahub-project/datahub.git
synced 2025-12-27 18:07:57 +00:00
feat(ingest): Added new ingestion source SAP HANA (#4376)
Co-authored-by: Ravindra Lanka <rlanka@acryl.io>
This commit is contained in:
parent
a8c1df083f
commit
92338c7912
@ -12,6 +12,8 @@ on:
|
||||
paths:
|
||||
- "**/nifi/**"
|
||||
- "**/nifi.py"
|
||||
- "**/hana/**"
|
||||
- "**/hana.py"
|
||||
release:
|
||||
types: [published, edited]
|
||||
|
||||
|
||||
BIN
datahub-web-react/src/images/hanalogo.png
Normal file
BIN
datahub-web-react/src/images/hanalogo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.3 KiB |
@ -67,13 +67,14 @@ We use a plugin architecture so that you can install only the dependencies you a
|
||||
| [athena](./generated/ingestion/sources/athena.md) | `pip install 'acryl-datahub[athena]'` | AWS Athena source |
|
||||
| [bigquery](./generated/ingestion/sources/bigquery.md) | `pip install 'acryl-datahub[bigquery]'` | BigQuery source |
|
||||
| [bigquery-usage](./generated/ingestion/sources/bigquery.md#module-bigquery-usage) | `pip install 'acryl-datahub[bigquery-usage]'` | BigQuery usage statistics source |
|
||||
| [datahub-lineage-file](./generated/ingestion/sources/file-based-lineage.md) | _no additional dependencies_ | Lineage File source |
|
||||
| [datahub-lineage-file](./generated/ingestion/sources/file-based-lineage.md) | _no additional dependencies_ | Lineage File source |
|
||||
| [datahub-business-glossary](./generated/ingestion/sources/business-glossary.md) | _no additional dependencies_ | Business Glossary File source |
|
||||
| [dbt](./generated/ingestion/sources/dbt.md) | _no additional dependencies_ | dbt source |
|
||||
| [druid](./generated/ingestion/sources/druid.md) | `pip install 'acryl-datahub[druid]'` | Druid Source |
|
||||
| [feast-legacy](./generated/ingestion/sources/feast.md#module-feast-legacy) | `pip install 'acryl-datahub[feast-legacy]'` | Feast source (legacy) |
|
||||
| [feast-legacy](./generated/ingestion/sources/feast.md#module-feast-legacy) | `pip install 'acryl-datahub[feast-legacy]'` | Feast source (legacy) |
|
||||
| [feast](./generated/ingestion/sources/feast.md) | `pip install 'acryl-datahub[feast]'` | Feast source (0.18.0) |
|
||||
| [glue](./generated/ingestion/sources/glue.md) | `pip install 'acryl-datahub[glue]'` | AWS Glue source |
|
||||
| [hana](./generated/ingestion/sources/hana.md) | `pip install 'acryl-datahub[hana]'` | SAP HANA source |
|
||||
| [hive](./generated/ingestion/sources/hive.md) | `pip install 'acryl-datahub[hive]'` | Hive source |
|
||||
| [kafka](./generated/ingestion/sources/kafka.md) | `pip install 'acryl-datahub[kafka]'` | Kafka source |
|
||||
| [kafka-connect](./generated/ingestion/sources/kafka-connect.md) | `pip install 'acryl-datahub[kafka-connect]'` | Kafka connect source |
|
||||
|
||||
@ -35,6 +35,7 @@ Supported SQL sources:
|
||||
- [AWS Athena](./athena.md)
|
||||
- [BigQuery](./bigquery.md)
|
||||
- [Druid](./druid.md)
|
||||
- [HANA](./hana.md)
|
||||
- [Hive](./hive.md)
|
||||
- [Microsoft SQL Server](./mssql.md)
|
||||
- [MySQL](./mysql.md)
|
||||
|
||||
10
metadata-ingestion/docs/sources/hana/hana.md
Normal file
10
metadata-ingestion/docs/sources/hana/hana.md
Normal file
@ -0,0 +1,10 @@
|
||||
## Integration Details
|
||||
The implementation uses the [SQLAlchemy Dialect for SAP HANA](https://github.com/SAP/sqlalchemy-hana). The SQLAlchemy Dialect for SAP HANA is an open-source project hosted at GitHub that is actively maintained by SAP SE, and is not part of a licensed SAP HANA edition or option. It is provided under the terms of the project license. Please notice that sqlalchemy-hana isn't an official SAP product and isn't covered by SAP support.
|
||||
|
||||
## Compatibility
|
||||
|
||||
Under the hood, [SQLAlchemy Dialect for SAP HANA](https://github.com/SAP/sqlalchemy-hana) uses the SAP HANA Python Driver hdbcli. Therefore it is compatible with HANA or HANA express versions since HANA SPS 2.
|
||||
|
||||
## Questions
|
||||
|
||||
If you've got any questions on configuring this source, feel free to ping us on [our Slack](https://slack.datahubproject.io/)!
|
||||
13
metadata-ingestion/docs/sources/hana/hana_recipe.yml
Normal file
13
metadata-ingestion/docs/sources/hana/hana_recipe.yml
Normal file
@ -0,0 +1,13 @@
|
||||
source:
|
||||
type: hana
|
||||
config:
|
||||
# Coordinates
|
||||
host_port: localhost:39041
|
||||
database: dbname
|
||||
|
||||
# Credentials
|
||||
username: ${HANA_USER}
|
||||
password: ${HANA_PASS}
|
||||
|
||||
sink:
|
||||
# sink configs
|
||||
21
metadata-ingestion/examples/recipes/hana_to_datahub.yml
Normal file
21
metadata-ingestion/examples/recipes/hana_to_datahub.yml
Normal file
@ -0,0 +1,21 @@
|
||||
---
|
||||
# see https://datahubproject.io/docs/metadata-ingestion/source_docs/hana for complete documentation
|
||||
source:
|
||||
type: "hana"
|
||||
config:
|
||||
host_port: localhost:39041
|
||||
database: HXE
|
||||
username: SYSTEM
|
||||
password: HXEHana1
|
||||
schema_pattern:
|
||||
allow:
|
||||
- "LOCALDEV"
|
||||
ignoreCase: true
|
||||
include_tables: true
|
||||
include_views: true
|
||||
|
||||
# see https://datahubproject.io/docs/metadata-ingestion/sink_docs/datahub for complete documentation
|
||||
sink:
|
||||
type: "datahub-rest"
|
||||
config:
|
||||
server: "http://localhost:8080"
|
||||
@ -55,7 +55,8 @@ asyncio_mode = auto
|
||||
addopts = --cov=src --cov-report term-missing --cov-config setup.cfg --strict-markers
|
||||
markers =
|
||||
integration: marks tests to only run in integration (deselect with '-m "not integration"')
|
||||
slow_integration: marks tests that are too slow to even run in integration (deselect with '-m "not slow_integration")
|
||||
slow_integration: marks tests that are too slow to even run in integration (deselect with '-m "not slow_integration"')
|
||||
slow_hana: marks tests that are too slow to even run in integration (deselect with '-m "not slow_hana"')
|
||||
testpaths =
|
||||
tests/unit
|
||||
tests/integration
|
||||
|
||||
@ -194,6 +194,8 @@ plugins: Dict[str, Set[str]] = {
|
||||
"feast-legacy": {"docker"},
|
||||
"feast": {"feast==0.18.0", "flask-openid>=1.3.0"},
|
||||
"glue": aws_common,
|
||||
# hdbcli is supported officially by SAP, sqlalchemy-hana is built on top but not officially supported
|
||||
"hana": sql_common | {"sqlalchemy-hana>=0.5.0","hdbcli>=2.11.20"},
|
||||
"hive": sql_common
|
||||
| {
|
||||
# Acryl Data maintains a fork of PyHive
|
||||
@ -321,6 +323,7 @@ base_dev_requirements = {
|
||||
"ldap",
|
||||
"looker",
|
||||
"glue",
|
||||
"hana",
|
||||
"mariadb",
|
||||
"okta",
|
||||
"oracle",
|
||||
@ -393,6 +396,7 @@ full_test_dev_requirements = {
|
||||
for plugin in [
|
||||
"clickhouse",
|
||||
"druid",
|
||||
"hana",
|
||||
"feast-legacy",
|
||||
"hive",
|
||||
"ldap",
|
||||
@ -442,6 +446,7 @@ entry_points = {
|
||||
"feast = datahub.ingestion.source.feast:FeastRepositorySource",
|
||||
"glue = datahub.ingestion.source.aws.glue:GlueSource",
|
||||
"sagemaker = datahub.ingestion.source.aws.sagemaker:SagemakerSource",
|
||||
"hana = datahub.ingestion.source.sql.hana:HanaSource",
|
||||
"hive = datahub.ingestion.source.sql.hive:HiveSource",
|
||||
"kafka = datahub.ingestion.source.kafka:KafkaSource",
|
||||
"kafka-connect = datahub.ingestion.source.kafka_connect:KafkaConnectSource",
|
||||
|
||||
40
metadata-ingestion/src/datahub/ingestion/source/sql/hana.py
Normal file
40
metadata-ingestion/src/datahub/ingestion/source/sql/hana.py
Normal file
@ -0,0 +1,40 @@
|
||||
from typing import Dict
|
||||
|
||||
import pydantic
|
||||
|
||||
from datahub.ingestion.api.common import PipelineContext
|
||||
from datahub.ingestion.api.decorators import (
|
||||
SourceCapability,
|
||||
SupportStatus,
|
||||
capability,
|
||||
config_class,
|
||||
platform_name,
|
||||
support_status,
|
||||
)
|
||||
from datahub.ingestion.source.sql.sql_common import (
|
||||
BasicSQLAlchemyConfig,
|
||||
SQLAlchemySource,
|
||||
)
|
||||
|
||||
|
||||
class HanaConfig(BasicSQLAlchemyConfig):
|
||||
# Override defaults
|
||||
host_port: str = pydantic.Field(default="localhost:39041")
|
||||
scheme: str = pydantic.Field(default="hana+hdbcli")
|
||||
|
||||
|
||||
@platform_name("Hana")
|
||||
@config_class(HanaConfig)
|
||||
@support_status(SupportStatus.TESTING)
|
||||
@capability(SourceCapability.PLATFORM_INSTANCE, "Enabled by default")
|
||||
@capability(SourceCapability.DOMAINS, "Supported via the `domain` config field")
|
||||
@capability(SourceCapability.DATA_PROFILING, "Optionally enabled via configuration")
|
||||
@capability(SourceCapability.DELETION_DETECTION, "Enabled via stateful ingestion")
|
||||
class HanaSource(SQLAlchemySource):
|
||||
def __init__(self, config: HanaConfig, ctx: PipelineContext):
|
||||
super().__init__(config, ctx, "hana")
|
||||
|
||||
@classmethod
|
||||
def create(cls, config_dict: Dict, ctx: PipelineContext) -> "HanaSource":
|
||||
config = HanaConfig.parse_obj(config_dict)
|
||||
return cls(config, ctx)
|
||||
@ -117,6 +117,7 @@ PLATFORM_TO_SQLALCHEMY_URI_TESTER_MAP: Dict[str, Callable[[str], bool]] = Ordere
|
||||
_platform_alchemy_uri_tester_gen("bigquery"),
|
||||
_platform_alchemy_uri_tester_gen("clickhouse"),
|
||||
_platform_alchemy_uri_tester_gen("druid"),
|
||||
_platform_alchemy_uri_tester_gen("hana"),
|
||||
_platform_alchemy_uri_tester_gen("hive"),
|
||||
_platform_alchemy_uri_tester_gen("mongodb"),
|
||||
_platform_alchemy_uri_tester_gen("mssql"),
|
||||
|
||||
31
metadata-ingestion/tests/integration/hana/docker-compose.yml
Normal file
31
metadata-ingestion/tests/integration/hana/docker-compose.yml
Normal file
@ -0,0 +1,31 @@
|
||||
# Attention Hana pull requires that you are logged into Docker Hub prior to pulling the images (requirement by SAP as image provider)
|
||||
version: '3.4'
|
||||
services:
|
||||
testhana:
|
||||
image: "store/saplabs/hanaexpress:2.00.054.00.20210603.1"
|
||||
container_name: "testhana"
|
||||
restart: "unless-stopped"
|
||||
ports:
|
||||
- 39013:39013
|
||||
- 39017:39017
|
||||
- 39041-39045:39041-39045
|
||||
- 1128-1129:1128-1129
|
||||
- 59013-59014:59013-59014
|
||||
volumes:
|
||||
- ./post_start:/hana/hooks/post_start/
|
||||
- ./setup:/hana/mounts/setup/
|
||||
environment:
|
||||
- SCHEMA_NAME=HOTEL
|
||||
- DUMP_FILE=setup.sql
|
||||
- SCHEMA_PWD=Localdev1
|
||||
command:
|
||||
- --agree-to-sap-license
|
||||
- --dont-check-system
|
||||
- --dont-check-mount-points
|
||||
- --master-password
|
||||
- HXEHana1
|
||||
volumes:
|
||||
setup:
|
||||
driver: local
|
||||
post_start:
|
||||
driver: local
|
||||
864
metadata-ingestion/tests/integration/hana/hana_mces_golden.json
Normal file
864
metadata-ingestion/tests/integration/hana/hana_mces_golden.json
Normal file
@ -0,0 +1,864 @@
|
||||
[
|
||||
{
|
||||
"auditHeader": null,
|
||||
"entityType": "container",
|
||||
"entityUrn": "urn:li:container:c8107a53ee221a15de176e4d34a06940",
|
||||
"entityKeyAspect": null,
|
||||
"changeType": "UPSERT",
|
||||
"aspectName": "containerProperties",
|
||||
"aspect": {
|
||||
"value": "{\"customProperties\": {\"platform\": \"hana\", \"instance\": \"PROD\", \"database\": \"hxe\"}, \"name\": \"hxe\"}",
|
||||
"contentType": "application/json"
|
||||
},
|
||||
"systemMetadata": {
|
||||
"lastObserved": 1586847600000,
|
||||
"runId": "hana-test",
|
||||
"registryName": null,
|
||||
"registryVersion": null,
|
||||
"properties": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"auditHeader": null,
|
||||
"entityType": "container",
|
||||
"entityUrn": "urn:li:container:c8107a53ee221a15de176e4d34a06940",
|
||||
"entityKeyAspect": null,
|
||||
"changeType": "UPSERT",
|
||||
"aspectName": "dataPlatformInstance",
|
||||
"aspect": {
|
||||
"value": "{\"platform\": \"urn:li:dataPlatform:hana\"}",
|
||||
"contentType": "application/json"
|
||||
},
|
||||
"systemMetadata": {
|
||||
"lastObserved": 1586847600000,
|
||||
"runId": "hana-test",
|
||||
"registryName": null,
|
||||
"registryVersion": null,
|
||||
"properties": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"auditHeader": null,
|
||||
"entityType": "container",
|
||||
"entityUrn": "urn:li:container:c8107a53ee221a15de176e4d34a06940",
|
||||
"entityKeyAspect": null,
|
||||
"changeType": "UPSERT",
|
||||
"aspectName": "subTypes",
|
||||
"aspect": {
|
||||
"value": "{\"typeNames\": [\"Database\"]}",
|
||||
"contentType": "application/json"
|
||||
},
|
||||
"systemMetadata": {
|
||||
"lastObserved": 1586847600000,
|
||||
"runId": "hana-test",
|
||||
"registryName": null,
|
||||
"registryVersion": null,
|
||||
"properties": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"auditHeader": null,
|
||||
"entityType": "container",
|
||||
"entityUrn": "urn:li:container:f870c782e0a44727bd10da2ab742363b",
|
||||
"entityKeyAspect": null,
|
||||
"changeType": "UPSERT",
|
||||
"aspectName": "containerProperties",
|
||||
"aspect": {
|
||||
"value": "{\"customProperties\": {\"platform\": \"hana\", \"instance\": \"PROD\", \"database\": \"hxe\", \"schema\": \"hotel\"}, \"name\": \"hotel\"}",
|
||||
"contentType": "application/json"
|
||||
},
|
||||
"systemMetadata": {
|
||||
"lastObserved": 1586847600000,
|
||||
"runId": "hana-test",
|
||||
"registryName": null,
|
||||
"registryVersion": null,
|
||||
"properties": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"auditHeader": null,
|
||||
"entityType": "container",
|
||||
"entityUrn": "urn:li:container:f870c782e0a44727bd10da2ab742363b",
|
||||
"entityKeyAspect": null,
|
||||
"changeType": "UPSERT",
|
||||
"aspectName": "dataPlatformInstance",
|
||||
"aspect": {
|
||||
"value": "{\"platform\": \"urn:li:dataPlatform:hana\"}",
|
||||
"contentType": "application/json"
|
||||
},
|
||||
"systemMetadata": {
|
||||
"lastObserved": 1586847600000,
|
||||
"runId": "hana-test",
|
||||
"registryName": null,
|
||||
"registryVersion": null,
|
||||
"properties": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"auditHeader": null,
|
||||
"entityType": "container",
|
||||
"entityUrn": "urn:li:container:f870c782e0a44727bd10da2ab742363b",
|
||||
"entityKeyAspect": null,
|
||||
"changeType": "UPSERT",
|
||||
"aspectName": "subTypes",
|
||||
"aspect": {
|
||||
"value": "{\"typeNames\": [\"Schema\"]}",
|
||||
"contentType": "application/json"
|
||||
},
|
||||
"systemMetadata": {
|
||||
"lastObserved": 1586847600000,
|
||||
"runId": "hana-test",
|
||||
"registryName": null,
|
||||
"registryVersion": null,
|
||||
"properties": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"auditHeader": null,
|
||||
"entityType": "container",
|
||||
"entityUrn": "urn:li:container:f870c782e0a44727bd10da2ab742363b",
|
||||
"entityKeyAspect": null,
|
||||
"changeType": "UPSERT",
|
||||
"aspectName": "container",
|
||||
"aspect": {
|
||||
"value": "{\"container\": \"urn:li:container:c8107a53ee221a15de176e4d34a06940\"}",
|
||||
"contentType": "application/json"
|
||||
},
|
||||
"systemMetadata": {
|
||||
"lastObserved": 1586847600000,
|
||||
"runId": "hana-test",
|
||||
"registryName": null,
|
||||
"registryVersion": null,
|
||||
"properties": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"auditHeader": null,
|
||||
"entityType": "dataset",
|
||||
"entityUrn": "urn:li:dataset:(urn:li:dataPlatform:hana,hotel.customer,PROD)",
|
||||
"entityKeyAspect": null,
|
||||
"changeType": "UPSERT",
|
||||
"aspectName": "container",
|
||||
"aspect": {
|
||||
"value": "{\"container\": \"urn:li:container:f870c782e0a44727bd10da2ab742363b\"}",
|
||||
"contentType": "application/json"
|
||||
},
|
||||
"systemMetadata": {
|
||||
"lastObserved": 1586847600000,
|
||||
"runId": "hana-test",
|
||||
"registryName": null,
|
||||
"registryVersion": null,
|
||||
"properties": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"auditHeader": null,
|
||||
"proposedSnapshot": {
|
||||
"com.linkedin.pegasus2avro.metadata.snapshot.DatasetSnapshot": {
|
||||
"urn": "urn:li:dataset:(urn:li:dataPlatform:hana,hotel.customer,PROD)",
|
||||
"aspects": [
|
||||
{
|
||||
"com.linkedin.pegasus2avro.common.Status": {
|
||||
"removed": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"com.linkedin.pegasus2avro.dataset.DatasetProperties": {
|
||||
"customProperties": {},
|
||||
"externalUrl": null,
|
||||
"name": "customer",
|
||||
"qualifiedName": null,
|
||||
"description": null,
|
||||
"uri": null,
|
||||
"tags": []
|
||||
}
|
||||
},
|
||||
{
|
||||
"com.linkedin.pegasus2avro.schema.SchemaMetadata": {
|
||||
"schemaName": "hotel.customer",
|
||||
"platform": "urn:li:dataPlatform:hana",
|
||||
"version": 0,
|
||||
"created": {
|
||||
"time": 0,
|
||||
"actor": "urn:li:corpuser:unknown",
|
||||
"impersonator": null
|
||||
},
|
||||
"lastModified": {
|
||||
"time": 0,
|
||||
"actor": "urn:li:corpuser:unknown",
|
||||
"impersonator": null
|
||||
},
|
||||
"deleted": null,
|
||||
"dataset": null,
|
||||
"cluster": null,
|
||||
"hash": "",
|
||||
"platformSchema": {
|
||||
"com.linkedin.pegasus2avro.schema.MySqlDDL": {
|
||||
"tableSchema": ""
|
||||
}
|
||||
},
|
||||
"fields": [
|
||||
{
|
||||
"fieldPath": "cno",
|
||||
"jsonPath": null,
|
||||
"nullable": false,
|
||||
"description": null,
|
||||
"type": {
|
||||
"type": {
|
||||
"com.linkedin.pegasus2avro.schema.NumberType": {}
|
||||
}
|
||||
},
|
||||
"nativeDataType": "INTEGER()",
|
||||
"recursive": false,
|
||||
"globalTags": null,
|
||||
"glossaryTerms": null,
|
||||
"isPartOfKey": true,
|
||||
"isPartitioningKey": null,
|
||||
"jsonProps": null
|
||||
},
|
||||
{
|
||||
"fieldPath": "title",
|
||||
"jsonPath": null,
|
||||
"nullable": true,
|
||||
"description": null,
|
||||
"type": {
|
||||
"type": {
|
||||
"com.linkedin.pegasus2avro.schema.StringType": {}
|
||||
}
|
||||
},
|
||||
"nativeDataType": "VARCHAR(length=7)",
|
||||
"recursive": false,
|
||||
"globalTags": null,
|
||||
"glossaryTerms": null,
|
||||
"isPartOfKey": false,
|
||||
"isPartitioningKey": null,
|
||||
"jsonProps": null
|
||||
},
|
||||
{
|
||||
"fieldPath": "firstname",
|
||||
"jsonPath": null,
|
||||
"nullable": true,
|
||||
"description": null,
|
||||
"type": {
|
||||
"type": {
|
||||
"com.linkedin.pegasus2avro.schema.StringType": {}
|
||||
}
|
||||
},
|
||||
"nativeDataType": "VARCHAR(length=20)",
|
||||
"recursive": false,
|
||||
"globalTags": null,
|
||||
"glossaryTerms": null,
|
||||
"isPartOfKey": false,
|
||||
"isPartitioningKey": null,
|
||||
"jsonProps": null
|
||||
},
|
||||
{
|
||||
"fieldPath": "name",
|
||||
"jsonPath": null,
|
||||
"nullable": false,
|
||||
"description": null,
|
||||
"type": {
|
||||
"type": {
|
||||
"com.linkedin.pegasus2avro.schema.StringType": {}
|
||||
}
|
||||
},
|
||||
"nativeDataType": "VARCHAR(length=40)",
|
||||
"recursive": false,
|
||||
"globalTags": null,
|
||||
"glossaryTerms": null,
|
||||
"isPartOfKey": false,
|
||||
"isPartitioningKey": null,
|
||||
"jsonProps": null
|
||||
},
|
||||
{
|
||||
"fieldPath": "address",
|
||||
"jsonPath": null,
|
||||
"nullable": false,
|
||||
"description": null,
|
||||
"type": {
|
||||
"type": {
|
||||
"com.linkedin.pegasus2avro.schema.StringType": {}
|
||||
}
|
||||
},
|
||||
"nativeDataType": "VARCHAR(length=40)",
|
||||
"recursive": false,
|
||||
"globalTags": null,
|
||||
"glossaryTerms": null,
|
||||
"isPartOfKey": false,
|
||||
"isPartitioningKey": null,
|
||||
"jsonProps": null
|
||||
},
|
||||
{
|
||||
"fieldPath": "zip",
|
||||
"jsonPath": null,
|
||||
"nullable": true,
|
||||
"description": null,
|
||||
"type": {
|
||||
"type": {
|
||||
"com.linkedin.pegasus2avro.schema.StringType": {}
|
||||
}
|
||||
},
|
||||
"nativeDataType": "VARCHAR(length=6)",
|
||||
"recursive": false,
|
||||
"globalTags": null,
|
||||
"glossaryTerms": null,
|
||||
"isPartOfKey": false,
|
||||
"isPartitioningKey": null,
|
||||
"jsonProps": null
|
||||
}
|
||||
],
|
||||
"primaryKeys": null,
|
||||
"foreignKeysSpecs": null,
|
||||
"foreignKeys": null
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"proposedDelta": null,
|
||||
"systemMetadata": {
|
||||
"lastObserved": 1586847600000,
|
||||
"runId": "hana-test",
|
||||
"registryName": null,
|
||||
"registryVersion": null,
|
||||
"properties": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"auditHeader": null,
|
||||
"entityType": "dataset",
|
||||
"entityUrn": "urn:li:dataset:(urn:li:dataPlatform:hana,hotel.customer,PROD)",
|
||||
"entityKeyAspect": null,
|
||||
"changeType": "UPSERT",
|
||||
"aspectName": "subTypes",
|
||||
"aspect": {
|
||||
"value": "{\"typeNames\": [\"table\"]}",
|
||||
"contentType": "application/json"
|
||||
},
|
||||
"systemMetadata": {
|
||||
"lastObserved": 1586847600000,
|
||||
"runId": "hana-test",
|
||||
"registryName": null,
|
||||
"registryVersion": null,
|
||||
"properties": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"auditHeader": null,
|
||||
"entityType": "dataset",
|
||||
"entityUrn": "urn:li:dataset:(urn:li:dataPlatform:hana,hotel.customer,PROD)",
|
||||
"entityKeyAspect": null,
|
||||
"changeType": "UPSERT",
|
||||
"aspectName": "domains",
|
||||
"aspect": {
|
||||
"value": "{\"domains\": [\"urn:li:domain:sales\"]}",
|
||||
"contentType": "application/json"
|
||||
},
|
||||
"systemMetadata": {
|
||||
"lastObserved": 1586847600000,
|
||||
"runId": "hana-test",
|
||||
"registryName": null,
|
||||
"registryVersion": null,
|
||||
"properties": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"auditHeader": null,
|
||||
"entityType": "dataset",
|
||||
"entityUrn": "urn:li:dataset:(urn:li:dataPlatform:hana,hotel.hotel,PROD)",
|
||||
"entityKeyAspect": null,
|
||||
"changeType": "UPSERT",
|
||||
"aspectName": "container",
|
||||
"aspect": {
|
||||
"value": "{\"container\": \"urn:li:container:f870c782e0a44727bd10da2ab742363b\"}",
|
||||
"contentType": "application/json"
|
||||
},
|
||||
"systemMetadata": {
|
||||
"lastObserved": 1586847600000,
|
||||
"runId": "hana-test",
|
||||
"registryName": null,
|
||||
"registryVersion": null,
|
||||
"properties": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"auditHeader": null,
|
||||
"proposedSnapshot": {
|
||||
"com.linkedin.pegasus2avro.metadata.snapshot.DatasetSnapshot": {
|
||||
"urn": "urn:li:dataset:(urn:li:dataPlatform:hana,hotel.hotel,PROD)",
|
||||
"aspects": [
|
||||
{
|
||||
"com.linkedin.pegasus2avro.common.Status": {
|
||||
"removed": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"com.linkedin.pegasus2avro.dataset.DatasetProperties": {
|
||||
"customProperties": {},
|
||||
"externalUrl": null,
|
||||
"name": "hotel",
|
||||
"qualifiedName": null,
|
||||
"description": null,
|
||||
"uri": null,
|
||||
"tags": []
|
||||
}
|
||||
},
|
||||
{
|
||||
"com.linkedin.pegasus2avro.schema.SchemaMetadata": {
|
||||
"schemaName": "hotel.hotel",
|
||||
"platform": "urn:li:dataPlatform:hana",
|
||||
"version": 0,
|
||||
"created": {
|
||||
"time": 0,
|
||||
"actor": "urn:li:corpuser:unknown",
|
||||
"impersonator": null
|
||||
},
|
||||
"lastModified": {
|
||||
"time": 0,
|
||||
"actor": "urn:li:corpuser:unknown",
|
||||
"impersonator": null
|
||||
},
|
||||
"deleted": null,
|
||||
"dataset": null,
|
||||
"cluster": null,
|
||||
"hash": "",
|
||||
"platformSchema": {
|
||||
"com.linkedin.pegasus2avro.schema.MySqlDDL": {
|
||||
"tableSchema": ""
|
||||
}
|
||||
},
|
||||
"fields": [
|
||||
{
|
||||
"fieldPath": "hno",
|
||||
"jsonPath": null,
|
||||
"nullable": false,
|
||||
"description": null,
|
||||
"type": {
|
||||
"type": {
|
||||
"com.linkedin.pegasus2avro.schema.NumberType": {}
|
||||
}
|
||||
},
|
||||
"nativeDataType": "INTEGER()",
|
||||
"recursive": false,
|
||||
"globalTags": null,
|
||||
"glossaryTerms": null,
|
||||
"isPartOfKey": true,
|
||||
"isPartitioningKey": null,
|
||||
"jsonProps": null
|
||||
},
|
||||
{
|
||||
"fieldPath": "name",
|
||||
"jsonPath": null,
|
||||
"nullable": false,
|
||||
"description": null,
|
||||
"type": {
|
||||
"type": {
|
||||
"com.linkedin.pegasus2avro.schema.StringType": {}
|
||||
}
|
||||
},
|
||||
"nativeDataType": "VARCHAR(length=50)",
|
||||
"recursive": false,
|
||||
"globalTags": null,
|
||||
"glossaryTerms": null,
|
||||
"isPartOfKey": false,
|
||||
"isPartitioningKey": null,
|
||||
"jsonProps": null
|
||||
},
|
||||
{
|
||||
"fieldPath": "address",
|
||||
"jsonPath": null,
|
||||
"nullable": false,
|
||||
"description": null,
|
||||
"type": {
|
||||
"type": {
|
||||
"com.linkedin.pegasus2avro.schema.StringType": {}
|
||||
}
|
||||
},
|
||||
"nativeDataType": "VARCHAR(length=40)",
|
||||
"recursive": false,
|
||||
"globalTags": null,
|
||||
"glossaryTerms": null,
|
||||
"isPartOfKey": false,
|
||||
"isPartitioningKey": null,
|
||||
"jsonProps": null
|
||||
},
|
||||
{
|
||||
"fieldPath": "city",
|
||||
"jsonPath": null,
|
||||
"nullable": false,
|
||||
"description": null,
|
||||
"type": {
|
||||
"type": {
|
||||
"com.linkedin.pegasus2avro.schema.StringType": {}
|
||||
}
|
||||
},
|
||||
"nativeDataType": "VARCHAR(length=30)",
|
||||
"recursive": false,
|
||||
"globalTags": null,
|
||||
"glossaryTerms": null,
|
||||
"isPartOfKey": false,
|
||||
"isPartitioningKey": null,
|
||||
"jsonProps": null
|
||||
},
|
||||
{
|
||||
"fieldPath": "state",
|
||||
"jsonPath": null,
|
||||
"nullable": false,
|
||||
"description": null,
|
||||
"type": {
|
||||
"type": {
|
||||
"com.linkedin.pegasus2avro.schema.StringType": {}
|
||||
}
|
||||
},
|
||||
"nativeDataType": "VARCHAR(length=2)",
|
||||
"recursive": false,
|
||||
"globalTags": null,
|
||||
"glossaryTerms": null,
|
||||
"isPartOfKey": false,
|
||||
"isPartitioningKey": null,
|
||||
"jsonProps": null
|
||||
},
|
||||
{
|
||||
"fieldPath": "zip",
|
||||
"jsonPath": null,
|
||||
"nullable": true,
|
||||
"description": null,
|
||||
"type": {
|
||||
"type": {
|
||||
"com.linkedin.pegasus2avro.schema.StringType": {}
|
||||
}
|
||||
},
|
||||
"nativeDataType": "VARCHAR(length=6)",
|
||||
"recursive": false,
|
||||
"globalTags": null,
|
||||
"glossaryTerms": null,
|
||||
"isPartOfKey": false,
|
||||
"isPartitioningKey": null,
|
||||
"jsonProps": null
|
||||
}
|
||||
],
|
||||
"primaryKeys": null,
|
||||
"foreignKeysSpecs": null,
|
||||
"foreignKeys": null
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"proposedDelta": null,
|
||||
"systemMetadata": {
|
||||
"lastObserved": 1586847600000,
|
||||
"runId": "hana-test",
|
||||
"registryName": null,
|
||||
"registryVersion": null,
|
||||
"properties": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"auditHeader": null,
|
||||
"entityType": "dataset",
|
||||
"entityUrn": "urn:li:dataset:(urn:li:dataPlatform:hana,hotel.hotel,PROD)",
|
||||
"entityKeyAspect": null,
|
||||
"changeType": "UPSERT",
|
||||
"aspectName": "subTypes",
|
||||
"aspect": {
|
||||
"value": "{\"typeNames\": [\"table\"]}",
|
||||
"contentType": "application/json"
|
||||
},
|
||||
"systemMetadata": {
|
||||
"lastObserved": 1586847600000,
|
||||
"runId": "hana-test",
|
||||
"registryName": null,
|
||||
"registryVersion": null,
|
||||
"properties": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"auditHeader": null,
|
||||
"entityType": "dataset",
|
||||
"entityUrn": "urn:li:dataset:(urn:li:dataPlatform:hana,hotel.hotel,PROD)",
|
||||
"entityKeyAspect": null,
|
||||
"changeType": "UPSERT",
|
||||
"aspectName": "domains",
|
||||
"aspect": {
|
||||
"value": "{\"domains\": [\"urn:li:domain:sales\"]}",
|
||||
"contentType": "application/json"
|
||||
},
|
||||
"systemMetadata": {
|
||||
"lastObserved": 1586847600000,
|
||||
"runId": "hana-test",
|
||||
"registryName": null,
|
||||
"registryVersion": null,
|
||||
"properties": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"auditHeader": null,
|
||||
"entityType": "dataset",
|
||||
"entityUrn": "urn:li:dataset:(urn:li:dataPlatform:hana,hotel.maintenance,PROD)",
|
||||
"entityKeyAspect": null,
|
||||
"changeType": "UPSERT",
|
||||
"aspectName": "container",
|
||||
"aspect": {
|
||||
"value": "{\"container\": \"urn:li:container:f870c782e0a44727bd10da2ab742363b\"}",
|
||||
"contentType": "application/json"
|
||||
},
|
||||
"systemMetadata": {
|
||||
"lastObserved": 1586847600000,
|
||||
"runId": "hana-test",
|
||||
"registryName": null,
|
||||
"registryVersion": null,
|
||||
"properties": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"auditHeader": null,
|
||||
"proposedSnapshot": {
|
||||
"com.linkedin.pegasus2avro.metadata.snapshot.DatasetSnapshot": {
|
||||
"urn": "urn:li:dataset:(urn:li:dataPlatform:hana,hotel.maintenance,PROD)",
|
||||
"aspects": [
|
||||
{
|
||||
"com.linkedin.pegasus2avro.common.Status": {
|
||||
"removed": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"com.linkedin.pegasus2avro.dataset.DatasetProperties": {
|
||||
"customProperties": {},
|
||||
"externalUrl": null,
|
||||
"name": "maintenance",
|
||||
"qualifiedName": null,
|
||||
"description": null,
|
||||
"uri": null,
|
||||
"tags": []
|
||||
}
|
||||
},
|
||||
{
|
||||
"com.linkedin.pegasus2avro.schema.SchemaMetadata": {
|
||||
"schemaName": "hotel.maintenance",
|
||||
"platform": "urn:li:dataPlatform:hana",
|
||||
"version": 0,
|
||||
"created": {
|
||||
"time": 0,
|
||||
"actor": "urn:li:corpuser:unknown",
|
||||
"impersonator": null
|
||||
},
|
||||
"lastModified": {
|
||||
"time": 0,
|
||||
"actor": "urn:li:corpuser:unknown",
|
||||
"impersonator": null
|
||||
},
|
||||
"deleted": null,
|
||||
"dataset": null,
|
||||
"cluster": null,
|
||||
"hash": "",
|
||||
"platformSchema": {
|
||||
"com.linkedin.pegasus2avro.schema.MySqlDDL": {
|
||||
"tableSchema": ""
|
||||
}
|
||||
},
|
||||
"fields": [
|
||||
{
|
||||
"fieldPath": "mno",
|
||||
"jsonPath": null,
|
||||
"nullable": false,
|
||||
"description": null,
|
||||
"type": {
|
||||
"type": {
|
||||
"com.linkedin.pegasus2avro.schema.NumberType": {}
|
||||
}
|
||||
},
|
||||
"nativeDataType": "INTEGER()",
|
||||
"recursive": false,
|
||||
"globalTags": null,
|
||||
"glossaryTerms": null,
|
||||
"isPartOfKey": true,
|
||||
"isPartitioningKey": null,
|
||||
"jsonProps": null
|
||||
},
|
||||
{
|
||||
"fieldPath": "hno",
|
||||
"jsonPath": null,
|
||||
"nullable": true,
|
||||
"description": null,
|
||||
"type": {
|
||||
"type": {
|
||||
"com.linkedin.pegasus2avro.schema.NumberType": {}
|
||||
}
|
||||
},
|
||||
"nativeDataType": "INTEGER()",
|
||||
"recursive": false,
|
||||
"globalTags": null,
|
||||
"glossaryTerms": null,
|
||||
"isPartOfKey": false,
|
||||
"isPartitioningKey": null,
|
||||
"jsonProps": null
|
||||
},
|
||||
{
|
||||
"fieldPath": "description",
|
||||
"jsonPath": null,
|
||||
"nullable": true,
|
||||
"description": null,
|
||||
"type": {
|
||||
"type": {
|
||||
"com.linkedin.pegasus2avro.schema.StringType": {}
|
||||
}
|
||||
},
|
||||
"nativeDataType": "VARCHAR(length=100)",
|
||||
"recursive": false,
|
||||
"globalTags": null,
|
||||
"glossaryTerms": null,
|
||||
"isPartOfKey": false,
|
||||
"isPartitioningKey": null,
|
||||
"jsonProps": null
|
||||
},
|
||||
{
|
||||
"fieldPath": "date_performed",
|
||||
"jsonPath": null,
|
||||
"nullable": true,
|
||||
"description": null,
|
||||
"type": {
|
||||
"type": {
|
||||
"com.linkedin.pegasus2avro.schema.DateType": {}
|
||||
}
|
||||
},
|
||||
"nativeDataType": "DATE()",
|
||||
"recursive": false,
|
||||
"globalTags": null,
|
||||
"glossaryTerms": null,
|
||||
"isPartOfKey": false,
|
||||
"isPartitioningKey": null,
|
||||
"jsonProps": null
|
||||
},
|
||||
{
|
||||
"fieldPath": "performed_by",
|
||||
"jsonPath": null,
|
||||
"nullable": true,
|
||||
"description": null,
|
||||
"type": {
|
||||
"type": {
|
||||
"com.linkedin.pegasus2avro.schema.StringType": {}
|
||||
}
|
||||
},
|
||||
"nativeDataType": "VARCHAR(length=40)",
|
||||
"recursive": false,
|
||||
"globalTags": null,
|
||||
"glossaryTerms": null,
|
||||
"isPartOfKey": false,
|
||||
"isPartitioningKey": null,
|
||||
"jsonProps": null
|
||||
}
|
||||
],
|
||||
"primaryKeys": null,
|
||||
"foreignKeysSpecs": null,
|
||||
"foreignKeys": null
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"proposedDelta": null,
|
||||
"systemMetadata": {
|
||||
"lastObserved": 1586847600000,
|
||||
"runId": "hana-test",
|
||||
"registryName": null,
|
||||
"registryVersion": null,
|
||||
"properties": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"auditHeader": null,
|
||||
"entityType": "dataset",
|
||||
"entityUrn": "urn:li:dataset:(urn:li:dataPlatform:hana,hotel.maintenance,PROD)",
|
||||
"entityKeyAspect": null,
|
||||
"changeType": "UPSERT",
|
||||
"aspectName": "subTypes",
|
||||
"aspect": {
|
||||
"value": "{\"typeNames\": [\"table\"]}",
|
||||
"contentType": "application/json"
|
||||
},
|
||||
"systemMetadata": {
|
||||
"lastObserved": 1586847600000,
|
||||
"runId": "hana-test",
|
||||
"registryName": null,
|
||||
"registryVersion": null,
|
||||
"properties": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"auditHeader": null,
|
||||
"entityType": "dataset",
|
||||
"entityUrn": "urn:li:dataset:(urn:li:dataPlatform:hana,hotel.maintenance,PROD)",
|
||||
"entityKeyAspect": null,
|
||||
"changeType": "UPSERT",
|
||||
"aspectName": "domains",
|
||||
"aspect": {
|
||||
"value": "{\"domains\": [\"urn:li:domain:sales\"]}",
|
||||
"contentType": "application/json"
|
||||
},
|
||||
"systemMetadata": {
|
||||
"lastObserved": 1586847600000,
|
||||
"runId": "hana-test",
|
||||
"registryName": null,
|
||||
"registryVersion": null,
|
||||
"properties": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"auditHeader": null,
|
||||
"entityType": "dataset",
|
||||
"entityUrn": "urn:li:dataset:(urn:li:dataPlatform:hana,hotel.customer,PROD)",
|
||||
"entityKeyAspect": null,
|
||||
"changeType": "UPSERT",
|
||||
"aspectName": "datasetProfile",
|
||||
"aspect": {
|
||||
"value": "{\"timestampMillis\": 1586847600000, \"partitionSpec\": {\"type\": \"FULL_TABLE\", \"partition\": \"FULL_TABLE_SNAPSHOT\"}, \"rowCount\": 15, \"columnCount\": 6, \"fieldProfiles\": [{\"fieldPath\": \"cno\", \"uniqueCount\": 15, \"uniqueProportion\": 1.0, \"nullCount\": 0, \"nullProportion\": 0.0, \"sampleValues\": [\"1000\", \"1001\", \"1002\", \"1003\", \"1004\", \"1005\", \"1006\", \"1007\", \"1008\", \"1009\", \"1010\", \"1011\", \"1012\", \"1013\", \"1014\"]}, {\"fieldPath\": \"title\", \"uniqueCount\": 3, \"uniqueProportion\": 0.2, \"nullCount\": 0, \"nullProportion\": 0.0, \"distinctValueFrequencies\": [{\"value\": \"Company\", \"frequency\": 2}, {\"value\": \"Mr\", \"frequency\": 7}, {\"value\": \"Mrs\", \"frequency\": 6}], \"sampleValues\": [\"Mrs\", \"Mr\", \"Company\", \"Mrs\", \"Mrs\", \"Mr\", \"Mrs\", \"Mr\", \"Mrs\", \"Mr\", \"Mr\", \"Mrs\", \"Mr\", \"Company\", \"Mr\"]}, {\"fieldPath\": \"firstname\", \"uniqueCount\": 13, \"uniqueProportion\": 1.0, \"nullCount\": 2, \"nullProportion\": 0.13333333333333333, \"sampleValues\": [\"Jenny\", \"Peter\", \"Rose\", \"Mary\", \"Martin\", \"Sally\", \"Mike\", \"Rita\", \"George\", \"Frank\", \"Susan\", \"Joseph\", \"Antony\"]}, {\"fieldPath\": \"name\", \"uniqueCount\": 15, \"uniqueProportion\": 1.0, \"nullCount\": 0, \"nullProportion\": 0.0, \"sampleValues\": [\"Porter\", \"Brown\", \"Datasoft\", \"Brian\", \"Griffith\", \"Randolph\", \"Smith\", \"Jackson\", \"Doe\", \"Howe\", \"Miller\", \"Baker\", \"Peters\", \"TOOLware\", \"Jenkins\"]}, {\"fieldPath\": \"address\", \"uniqueCount\": 15, \"uniqueProportion\": 1.0, \"nullCount\": 0, \"nullProportion\": 0.0, \"sampleValues\": [\"1340 N. Ash Street, #3\", \"1001 34th St., APT.3\", \"486 Maple St.\", \"500 Yellowstone Drive, #2\", \"3401 Elder Lane\", \"340 MAIN STREET, #7\", \"250 Curtis Street\", \"133 BROADWAY APT. 1\", \"2000 Humboldt St., #6\", \"111 B Parkway, #23\", \"27 5th St., 76\", \"200 MAIN STREET, #94\", \"700 S. Ash St., APT.12\", \"410 Mariposa St., #10\", \"55 A Parkway, #15\"]}, {\"fieldPath\": \"zip\", \"uniqueCount\": 12, \"uniqueProportion\": 0.8, \"nullCount\": 0, \"nullProportion\": 0.0, \"distinctValueFrequencies\": [{\"value\": \"10580\", \"frequency\": 1}, {\"value\": \"20005\", \"frequency\": 1}, {\"value\": \"20019\", \"frequency\": 1}, {\"value\": \"20903\", \"frequency\": 1}, {\"value\": \"45211\", \"frequency\": 1}, {\"value\": \"48226\", \"frequency\": 1}, {\"value\": \"60615\", \"frequency\": 1}, {\"value\": \"75243\", \"frequency\": 3}, {\"value\": \"90018\", \"frequency\": 2}, {\"value\": \"92714\", \"frequency\": 1}, {\"value\": \"95054\", \"frequency\": 1}, {\"value\": \"97213\", \"frequency\": 1}], \"sampleValues\": [\"10580\", \"48226\", \"90018\", \"75243\", \"20005\", \"60615\", \"75243\", \"45211\", \"97213\", \"75243\", \"95054\", \"90018\", \"92714\", \"20019\", \"20903\"]}]}",
|
||||
"contentType": "application/json"
|
||||
},
|
||||
"systemMetadata": {
|
||||
"lastObserved": 1586847600000,
|
||||
"runId": "hana-test",
|
||||
"registryName": null,
|
||||
"registryVersion": null,
|
||||
"properties": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"auditHeader": null,
|
||||
"entityType": "dataset",
|
||||
"entityUrn": "urn:li:dataset:(urn:li:dataPlatform:hana,hotel.hotel,PROD)",
|
||||
"entityKeyAspect": null,
|
||||
"changeType": "UPSERT",
|
||||
"aspectName": "datasetProfile",
|
||||
"aspect": {
|
||||
"value": "{\"timestampMillis\": 1586847600000, \"partitionSpec\": {\"type\": \"FULL_TABLE\", \"partition\": \"FULL_TABLE_SNAPSHOT\"}, \"rowCount\": 17, \"columnCount\": 6, \"fieldProfiles\": [{\"fieldPath\": \"hno\", \"uniqueCount\": 17, \"uniqueProportion\": 1.0, \"nullCount\": 0, \"nullProportion\": 0.0, \"sampleValues\": [\"10\", \"11\", \"12\", \"13\", \"14\", \"15\", \"16\", \"17\", \"18\", \"19\", \"20\", \"21\", \"22\", \"23\", \"24\", \"25\", \"26\"]}, {\"fieldPath\": \"name\", \"uniqueCount\": 17, \"uniqueProportion\": 1.0, \"nullCount\": 0, \"nullProportion\": 0.0, \"sampleValues\": [\"Congress\", \"Regency\", \"Long Island\", \"Empire State\", \"Midtown\", \"Eighth Avenue\", \"Lake Michigan\", \"Airport\", \"Sunshine\", \"Beach\", \"Atlantic\", \"Long Beach\", \"Indian Horse\", \"Star\", \"River Boat\", \"Ocean Star\", \"Bella Ciente\"]}, {\"fieldPath\": \"address\", \"uniqueCount\": 17, \"uniqueProportion\": 1.0, \"nullCount\": 0, \"nullProportion\": 0.0, \"sampleValues\": [\"155 Beechwood St.\", \"477 17th Avenue\", \"1499 Grove Street\", \"65 Yellowstone Dr.\", \"12 Barnard St.\", \"112 8th Avenue\", \"354 OAK Terrace\", \"650 C Parkway\", \"200 Yellowstone Dr.\", \"1980 34th St.\", \"111 78th St.\", \"35 Broadway\", \"16 MAIN STREET\", \"13 Beechwood Place\", \"788 MAIN STREET\", \"45 Pacific Avenue\", \"1407 Marshall Ave\"]}, {\"fieldPath\": \"city\", \"uniqueCount\": 15, \"uniqueProportion\": 0.8823529411764706, \"nullCount\": 0, \"nullProportion\": 0.0, \"distinctValueFrequencies\": [{\"value\": \"Albany\", \"frequency\": 1}, {\"value\": \"Atlantic City\", \"frequency\": 1}, {\"value\": \"Chicago\", \"frequency\": 1}, {\"value\": \"Clearwater\", \"frequency\": 1}, {\"value\": \"Daytona Beach\", \"frequency\": 1}, {\"value\": \"Deerfield Beach\", \"frequency\": 1}, {\"value\": \"Hollywood\", \"frequency\": 1}, {\"value\": \"Long Beach\", \"frequency\": 1}, {\"value\": \"Long Island\", \"frequency\": 1}, {\"value\": \"Longview\", \"frequency\": 1}, {\"value\": \"New Orleans\", \"frequency\": 1}, {\"value\": \"New York\", \"frequency\": 2}, {\"value\": \"Palm Springs\", \"frequency\": 1}, {\"value\": \"Rosemont\", \"frequency\": 1}, {\"value\": \"Seattle\", \"frequency\": 2}], \"sampleValues\": [\"Seattle\", \"Seattle\", \"Long Island\", \"Albany\", \"New York\", \"New York\", \"Chicago\", \"Rosemont\", \"Clearwater\", \"Daytona Beach\", \"Deerfield Beach\", \"Long Beach\", \"Palm Springs\", \"Hollywood\", \"New Orleans\", \"Atlantic City\", \"Longview\"]}, {\"fieldPath\": \"state\", \"uniqueCount\": 8, \"uniqueProportion\": 0.47058823529411764, \"nullCount\": 0, \"nullProportion\": 0.0, \"distinctValueFrequencies\": [{\"value\": \"CA\", \"frequency\": 3}, {\"value\": \"FL\", \"frequency\": 3}, {\"value\": \"IL\", \"frequency\": 2}, {\"value\": \"LA\", \"frequency\": 1}, {\"value\": \"NJ\", \"frequency\": 1}, {\"value\": \"NY\", \"frequency\": 4}, {\"value\": \"TX\", \"frequency\": 1}, {\"value\": \"WA\", \"frequency\": 2}], \"sampleValues\": [\"WA\", \"WA\", \"NY\", \"NY\", \"NY\", \"NY\", \"IL\", \"IL\", \"FL\", \"FL\", \"FL\", \"CA\", \"CA\", \"CA\", \"LA\", \"NJ\", \"TX\"]}, {\"fieldPath\": \"zip\", \"uniqueCount\": 16, \"uniqueProportion\": 0.9411764705882353, \"nullCount\": 0, \"nullProportion\": 0.0, \"distinctValueFrequencies\": [{\"value\": \"08401\", \"frequency\": 1}, {\"value\": \"10019\", \"frequency\": 2}, {\"value\": \"11788\", \"frequency\": 1}, {\"value\": \"12203\", \"frequency\": 1}, {\"value\": \"20005\", \"frequency\": 1}, {\"value\": \"20037\", \"frequency\": 1}, {\"value\": \"32018\", \"frequency\": 1}, {\"value\": \"33441\", \"frequency\": 1}, {\"value\": \"33575\", \"frequency\": 1}, {\"value\": \"60018\", \"frequency\": 1}, {\"value\": \"60601\", \"frequency\": 1}, {\"value\": \"70112\", \"frequency\": 1}, {\"value\": \"75601\", \"frequency\": 1}, {\"value\": \"90029\", \"frequency\": 1}, {\"value\": \"90804\", \"frequency\": 1}, {\"value\": \"92262\", \"frequency\": 1}], \"sampleValues\": [\"20005\", \"20037\", \"11788\", \"12203\", \"10019\", \"10019\", \"60601\", \"60018\", \"33575\", \"32018\", \"33441\", \"90804\", \"92262\", \"90029\", \"70112\", \"08401\", \"75601\"]}]}",
|
||||
"contentType": "application/json"
|
||||
},
|
||||
"systemMetadata": {
|
||||
"lastObserved": 1586847600000,
|
||||
"runId": "hana-test",
|
||||
"registryName": null,
|
||||
"registryVersion": null,
|
||||
"properties": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"auditHeader": null,
|
||||
"entityType": "dataset",
|
||||
"entityUrn": "urn:li:dataset:(urn:li:dataPlatform:hana,hotel.maintenance,PROD)",
|
||||
"entityKeyAspect": null,
|
||||
"changeType": "UPSERT",
|
||||
"aspectName": "datasetProfile",
|
||||
"aspect": {
|
||||
"value": "{\"timestampMillis\": 1586847600000, \"partitionSpec\": {\"type\": \"FULL_TABLE\", \"partition\": \"FULL_TABLE_SNAPSHOT\"}, \"rowCount\": 3, \"columnCount\": 5, \"fieldProfiles\": [{\"fieldPath\": \"mno\", \"uniqueCount\": 3, \"uniqueProportion\": 1.0, \"nullCount\": 0, \"nullProportion\": 0.0, \"sampleValues\": [\"10\", \"11\", \"12\"]}, {\"fieldPath\": \"hno\", \"uniqueCount\": 3, \"uniqueProportion\": 1.0, \"nullCount\": 0, \"nullProportion\": 0.0, \"sampleValues\": [\"24\", \"25\", \"26\"]}, {\"fieldPath\": \"description\", \"uniqueCount\": 3, \"uniqueProportion\": 1.0, \"nullCount\": 0, \"nullProportion\": 0.0, \"sampleValues\": [\"Replace pool liner and pump\", \"Renovate the bar area. Replace TV and speakers\", \"Roof repair due to storm\"]}, {\"fieldPath\": \"date_performed\", \"uniqueCount\": 2, \"uniqueProportion\": 1.0, \"nullCount\": 1, \"nullProportion\": 0.3333333333333333, \"min\": \"2019-03-21\", \"max\": \"2020-11-29\", \"sampleValues\": [\"2019-03-21\", \"2020-11-29\"]}, {\"fieldPath\": \"performed_by\", \"uniqueCount\": 2, \"uniqueProportion\": 1.0, \"nullCount\": 1, \"nullProportion\": 0.3333333333333333, \"sampleValues\": [\"Discount Pool Supplies\", \"TV and Audio Superstore\"]}]}",
|
||||
"contentType": "application/json"
|
||||
},
|
||||
"systemMetadata": {
|
||||
"lastObserved": 1586847600000,
|
||||
"runId": "hana-test",
|
||||
"registryName": null,
|
||||
"registryVersion": null,
|
||||
"properties": null
|
||||
}
|
||||
}
|
||||
]
|
||||
41
metadata-ingestion/tests/integration/hana/hana_to_file.yml
Normal file
41
metadata-ingestion/tests/integration/hana/hana_to_file.yml
Normal file
@ -0,0 +1,41 @@
|
||||
run_id: hana-test
|
||||
|
||||
source:
|
||||
type: hana
|
||||
config:
|
||||
username: HOTEL
|
||||
password: Localdev1
|
||||
database: HXE
|
||||
host_port: localhost:39041
|
||||
schema_pattern:
|
||||
allow:
|
||||
- "HOTEL"
|
||||
ignoreCase: true
|
||||
table_pattern:
|
||||
deny:
|
||||
- "HOTEL.RESERVATION"
|
||||
- "HOTEL.ROOM"
|
||||
ignoreCase: true
|
||||
profile_pattern:
|
||||
allow:
|
||||
- "HOTEL"
|
||||
profiling:
|
||||
enabled: True
|
||||
include_field_null_count: true
|
||||
include_field_min_value: true
|
||||
include_field_max_value: true
|
||||
include_field_mean_value: true
|
||||
include_field_median_value: true
|
||||
include_field_stddev_value: true
|
||||
include_field_quantiles: true
|
||||
include_field_distinct_value_frequencies: true
|
||||
include_field_histogram: true
|
||||
include_field_sample_values: true
|
||||
domain:
|
||||
sales:
|
||||
allow:
|
||||
- "HOTEL"
|
||||
sink:
|
||||
type: file
|
||||
config:
|
||||
filename: "./hana_mces.json"
|
||||
21
metadata-ingestion/tests/integration/hana/post_start/import_sql.sh
Executable file
21
metadata-ingestion/tests/integration/hana/post_start/import_sql.sh
Executable file
@ -0,0 +1,21 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
#found in /run_hana.sh, hxe_optimize.sh
|
||||
#durinng the 'initial' phase there is key for SYSTEM available
|
||||
declare -r tenant_store_key=us_key_tenantdb
|
||||
|
||||
# import dump
|
||||
function main() {
|
||||
case "$_HOOK_START_TYPE" in
|
||||
initial)
|
||||
# create user
|
||||
/usr/sap/HXE/HDB90/exe/hdbsql -a -x -i 90 -d HXE -U ${tenant_store_key} -B UTF8 "CREATE USER $SCHEMA_NAME PASSWORD \"$SCHEMA_PWD\" NO FORCE_FIRST_PASSWORD_CHANGE" 2>&1
|
||||
/usr/sap/HXE/HDB90/exe/hdbsql -a -x -i 90 -d HXE -U ${tenant_store_key} -B UTF8 "ALTER USER $SCHEMA_NAME DISABLE PASSWORD LIFETIME" 2>&1
|
||||
# import dump
|
||||
/usr/sap/HXE/HDB90/exe/hdbsql -a -x -i 90 -d HXE -U ${tenant_store_key} -B UTF8 -I "/hana/mounts/setup/$DUMP_FILE" 2>&1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
main
|
||||
161
metadata-ingestion/tests/integration/hana/setup/setup.sql
Normal file
161
metadata-ingestion/tests/integration/hana/setup/setup.sql
Normal file
@ -0,0 +1,161 @@
|
||||
-- Sample data is taken from https://developers.sap.com/tutorials/hana-clients-hdbsql.html
|
||||
CREATE COLUMN TABLE HOTEL.HOTEL(
|
||||
hno INTEGER PRIMARY KEY,
|
||||
name VARCHAR(50) NOT NULL,
|
||||
address VARCHAR(40) NOT NULL,
|
||||
city VARCHAR(30) NOT NULL,
|
||||
state VARCHAR(2) NOT NULL,
|
||||
zip VARCHAR(6)
|
||||
);
|
||||
CREATE COLUMN TABLE HOTEL.ROOM(
|
||||
hno INTEGER,
|
||||
type VARCHAR(6),
|
||||
free NUMERIC(3),
|
||||
price NUMERIC(6, 2),
|
||||
PRIMARY KEY (hno, type),
|
||||
FOREIGN KEY (hno) REFERENCES HOTEL.HOTEL
|
||||
);
|
||||
CREATE COLUMN TABLE HOTEL.CUSTOMER(
|
||||
cno INTEGER PRIMARY KEY,
|
||||
title VARCHAR(7),
|
||||
firstname VARCHAR(20),
|
||||
name VARCHAR(40) NOT NULL,
|
||||
address VARCHAR(40) NOT NULL,
|
||||
zip VARCHAR(6)
|
||||
);
|
||||
CREATE COLUMN TABLE HOTEL.RESERVATION(
|
||||
resno INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
||||
rno INTEGER NOT NULL,
|
||||
cno INTEGER,
|
||||
hno INTEGER,
|
||||
type VARCHAR(6),
|
||||
arrival DATE NOT NULL,
|
||||
departure DATE NOT NULL,
|
||||
PRIMARY KEY (
|
||||
"RESNO", "ARRIVAL"
|
||||
),
|
||||
FOREIGN KEY(hno) REFERENCES HOTEL.HOTEL,
|
||||
FOREIGN KEY(cno) REFERENCES HOTEL.CUSTOMER
|
||||
);
|
||||
CREATE COLUMN TABLE HOTEL.MAINTENANCE(
|
||||
mno INTEGER PRIMARY KEY,
|
||||
hno INTEGER,
|
||||
description VARCHAR(100),
|
||||
date_performed DATE,
|
||||
performed_by VARCHAR(40)
|
||||
);
|
||||
|
||||
CREATE OR REPLACE PROCEDURE HOTEL.SHOW_RESERVATIONS(
|
||||
IN IN_HNO INTEGER, IN IN_ARRIVAL DATE)
|
||||
SQL SECURITY INVOKER
|
||||
READS SQL DATA
|
||||
AS BEGIN
|
||||
SELECT
|
||||
R.RESNO,
|
||||
R.ARRIVAL,
|
||||
DAYS_BETWEEN (R.ARRIVAL, R.DEPARTURE) as "Nights",
|
||||
H.NAME,
|
||||
CUS.TITLE,
|
||||
CUS.FIRSTNAME AS "FIRST NAME",
|
||||
CUS.NAME AS "LAST NAME"
|
||||
FROM
|
||||
HOTEL.RESERVATION AS R
|
||||
LEFT OUTER JOIN
|
||||
HOTEL.HOTEL AS H
|
||||
ON H.HNO = R.HNO
|
||||
LEFT OUTER JOIN
|
||||
HOTEL.CUSTOMER AS CUS
|
||||
ON CUS.CNO = R.CNO
|
||||
WHERE R.ARRIVAL = :IN_ARRIVAL AND
|
||||
H.HNO = :IN_HNO
|
||||
ORDER BY
|
||||
H.NAME ASC,
|
||||
R.ARRIVAL DESC;
|
||||
END;
|
||||
|
||||
INSERT INTO HOTEL.HOTEL VALUES(10, 'Congress', '155 Beechwood St.', 'Seattle', 'WA', '20005');
|
||||
INSERT INTO HOTEL.HOTEL VALUES(11, 'Regency', '477 17th Avenue', 'Seattle', 'WA', '20037');
|
||||
INSERT INTO HOTEL.HOTEL VALUES(12, 'Long Island', '1499 Grove Street', 'Long Island', 'NY', '11788');
|
||||
INSERT INTO HOTEL.HOTEL VALUES(13, 'Empire State', '65 Yellowstone Dr.', 'Albany', 'NY', '12203');
|
||||
INSERT INTO HOTEL.HOTEL VALUES(14, 'Midtown', '12 Barnard St.', 'New York', 'NY', '10019');
|
||||
INSERT INTO HOTEL.HOTEL VALUES(15, 'Eighth Avenue', '112 8th Avenue', 'New York', 'NY', '10019');
|
||||
INSERT INTO HOTEL.HOTEL VALUES(16, 'Lake Michigan', '354 OAK Terrace', 'Chicago', 'IL', '60601');
|
||||
INSERT INTO HOTEL.HOTEL VALUES(17, 'Airport', '650 C Parkway', 'Rosemont', 'IL', '60018');
|
||||
INSERT INTO HOTEL.HOTEL VALUES(18, 'Sunshine', '200 Yellowstone Dr.', 'Clearwater', 'FL', '33575');
|
||||
INSERT INTO HOTEL.HOTEL VALUES(19, 'Beach', '1980 34th St.', 'Daytona Beach', 'FL', '32018');
|
||||
INSERT INTO HOTEL.HOTEL VALUES(20, 'Atlantic', '111 78th St.', 'Deerfield Beach', 'FL', '33441');
|
||||
INSERT INTO HOTEL.HOTEL VALUES(21, 'Long Beach', '35 Broadway', 'Long Beach', 'CA', '90804');
|
||||
INSERT INTO HOTEL.HOTEL VALUES(22, 'Indian Horse', '16 MAIN STREET', 'Palm Springs', 'CA', '92262');
|
||||
INSERT INTO HOTEL.HOTEL VALUES(23, 'Star', '13 Beechwood Place', 'Hollywood', 'CA', '90029');
|
||||
INSERT INTO HOTEL.HOTEL VALUES(24, 'River Boat', '788 MAIN STREET', 'New Orleans', 'LA', '70112');
|
||||
INSERT INTO HOTEL.HOTEL VALUES(25, 'Ocean Star', '45 Pacific Avenue', 'Atlantic City', 'NJ', '08401');
|
||||
INSERT INTO HOTEL.HOTEL VALUES(26, 'Bella Ciente', '1407 Marshall Ave', 'Longview', 'TX', '75601');
|
||||
|
||||
INSERT INTO HOTEL.ROOM VALUES(10, 'single', 20, 135.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(10, 'double', 45, 200.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(12, 'single', 10, 70.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(12, 'double', 13, 100.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(13, 'single', 12, 45.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(13, 'double', 15, 80.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(14, 'single', 20, 85.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(14, 'double', 35, 140.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(15, 'single', 50, 105.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(15, 'double', 230, 180.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(15, 'suite', 12, 500.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(16, 'single', 10, 120.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(16, 'double', 39, 200.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(16, 'suite', 20, 500.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(17, 'single', 4, 115.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(17, 'double', 11, 180.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(18, 'single', 15, 90.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(18, 'double', 19, 150.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(18, 'suite', 5, 400.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(19, 'single', 45, 90.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(19, 'double', 145, 150.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(19, 'suite', 60, 300.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(20, 'single', 11, 60.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(20, 'double', 24, 100.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(21, 'single', 2, 70.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(21, 'double', 10, 130.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(22, 'single', 34, 80.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(22, 'double', 78, 140.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(22, 'suite', 55, 350.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(23, 'single', 89, 160.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(23, 'double', 300, 270.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(23, 'suite', 100, 700.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(24, 'single', 10, 125.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(24, 'double', 9, 200.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(24, 'suite', 78, 600.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(25, 'single', 44, 100.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(25, 'double', 115, 190.00);
|
||||
INSERT INTO HOTEL.ROOM VALUES(25, 'suite', 6, 450.00);
|
||||
|
||||
INSERT INTO HOTEL.CUSTOMER VALUES(1000, 'Mrs', 'Jenny', 'Porter', '1340 N. Ash Street, #3', '10580');
|
||||
INSERT INTO HOTEL.CUSTOMER VALUES(1001, 'Mr', 'Peter', 'Brown', '1001 34th St., APT.3', '48226');
|
||||
INSERT INTO HOTEL.CUSTOMER VALUES(1002, 'Company', NULL, 'Datasoft', '486 Maple St.', '90018');
|
||||
INSERT INTO HOTEL.CUSTOMER VALUES(1003, 'Mrs', 'Rose', 'Brian', '500 Yellowstone Drive, #2', '75243');
|
||||
INSERT INTO HOTEL.CUSTOMER VALUES(1004, 'Mrs', 'Mary', 'Griffith', '3401 Elder Lane', '20005');
|
||||
INSERT INTO HOTEL.CUSTOMER VALUES(1005, 'Mr', 'Martin', 'Randolph', '340 MAIN STREET, #7', '60615');
|
||||
INSERT INTO HOTEL.CUSTOMER VALUES(1006, 'Mrs', 'Sally', 'Smith', '250 Curtis Street', '75243');
|
||||
INSERT INTO HOTEL.CUSTOMER VALUES(1007, 'Mr', 'Mike', 'Jackson', '133 BROADWAY APT. 1', '45211');
|
||||
INSERT INTO HOTEL.CUSTOMER VALUES(1008, 'Mrs', 'Rita', 'Doe', '2000 Humboldt St., #6', '97213');
|
||||
INSERT INTO HOTEL.CUSTOMER VALUES(1009, 'Mr', 'George', 'Howe', '111 B Parkway, #23', '75243');
|
||||
INSERT INTO HOTEL.CUSTOMER VALUES(1010, 'Mr', 'Frank', 'Miller', '27 5th St., 76', '95054');
|
||||
INSERT INTO HOTEL.CUSTOMER VALUES(1011, 'Mrs', 'Susan', 'Baker', '200 MAIN STREET, #94', '90018');
|
||||
INSERT INTO HOTEL.CUSTOMER VALUES(1012, 'Mr', 'Joseph', 'Peters', '700 S. Ash St., APT.12', '92714');
|
||||
INSERT INTO HOTEL.CUSTOMER VALUES(1013, 'Company', NULL, 'TOOLware', '410 Mariposa St., #10', '20019');
|
||||
INSERT INTO HOTEL.CUSTOMER VALUES(1014, 'Mr', 'Antony', 'Jenkins', '55 A Parkway, #15', '20903');
|
||||
INSERT INTO HOTEL.RESERVATION VALUES(1, 100, 1000, 11, 'single', '2020-12-24', '2020-12-27');
|
||||
INSERT INTO HOTEL.RESERVATION VALUES(2, 110, 1001, 11, 'double', '2020-12-24', '2021-01-03');
|
||||
INSERT INTO HOTEL.RESERVATION VALUES(3, 120, 1002, 15, 'suite', '2020-11-14', '2020-11-18');
|
||||
INSERT INTO HOTEL.RESERVATION VALUES(4, 130, 1009, 21, 'single', '2019-02-01', '2019-02-03');
|
||||
INSERT INTO HOTEL.RESERVATION VALUES(5, 150, 1006, 17, 'double', '2019-03-14', '2019-03-24');
|
||||
INSERT INTO HOTEL.RESERVATION VALUES(6, 140, 1013, 20, 'double', '2020-04-12', '2020-04-30');
|
||||
INSERT INTO HOTEL.RESERVATION VALUES(7, 160, 1011, 17, 'single', '2020-04-12', '2020-04-15');
|
||||
INSERT INTO HOTEL.RESERVATION VALUES(8, 170, 1014, 25, 'suite', '2020-09-01', '2020-09-03');
|
||||
INSERT INTO HOTEL.RESERVATION VALUES(9, 180, 1001, 22, 'double', '2020-12-23', '2021-01-08');
|
||||
INSERT INTO HOTEL.RESERVATION VALUES(10, 190, 1013, 24, 'double', '2020-11-14', '2020-11-17');
|
||||
|
||||
INSERT INTO HOTEL.MAINTENANCE VALUES(10, 24, 'Replace pool liner and pump', '2019-03-21', 'Discount Pool Supplies');
|
||||
INSERT INTO HOTEL.MAINTENANCE VALUES(11, 25, 'Renovate the bar area. Replace TV and speakers', '2020-11-29', 'TV and Audio Superstore');
|
||||
INSERT INTO HOTEL.MAINTENANCE VALUES(12, 26, 'Roof repair due to storm', null, null);
|
||||
40
metadata-ingestion/tests/integration/hana/test_hana.py
Normal file
40
metadata-ingestion/tests/integration/hana/test_hana.py
Normal file
@ -0,0 +1,40 @@
|
||||
import pytest
|
||||
from freezegun import freeze_time
|
||||
|
||||
from tests.test_helpers import mce_helpers
|
||||
from tests.test_helpers.click_helpers import run_datahub_cmd
|
||||
from tests.test_helpers.docker_helpers import wait_for_port
|
||||
|
||||
FROZEN_TIME = "2020-04-14 07:00:00"
|
||||
|
||||
|
||||
@freeze_time(FROZEN_TIME)
|
||||
@pytest.mark.slow_integration
|
||||
def test_hana_ingest(docker_compose_runner, pytestconfig, tmp_path, mock_time):
|
||||
test_resources_dir = pytestconfig.rootpath / "tests/integration/hana"
|
||||
|
||||
with docker_compose_runner(
|
||||
test_resources_dir / "docker-compose.yml", "hana"
|
||||
) as docker_services:
|
||||
# added longer timeout and pause due to slow start of hana
|
||||
wait_for_port(
|
||||
docker_services=docker_services,
|
||||
container_name="testhana",
|
||||
container_port=39041,
|
||||
hostname="localhost",
|
||||
timeout=700,
|
||||
pause=50,
|
||||
)
|
||||
|
||||
# Run the metadata ingestion pipeline.
|
||||
config_file = (test_resources_dir / "hana_to_file.yml").resolve()
|
||||
run_datahub_cmd(
|
||||
["ingest", "--strict-warnings", "-c", f"{config_file}"], tmp_path=tmp_path
|
||||
)
|
||||
|
||||
# Verify the output.
|
||||
mce_helpers.check_golden_file(
|
||||
pytestconfig,
|
||||
output_path=tmp_path / "hana_mces.json",
|
||||
golden_path=test_resources_dir / "hana_mces_golden.json",
|
||||
)
|
||||
@ -26,6 +26,7 @@ def wait_for_port(
|
||||
container_port: int,
|
||||
hostname: str = None,
|
||||
timeout: float = 30.0,
|
||||
pause: float = 0.5,
|
||||
) -> None:
|
||||
# import pdb
|
||||
|
||||
@ -34,7 +35,7 @@ def wait_for_port(
|
||||
# port = docker_services.port_for(container_name, container_port)
|
||||
docker_services.wait_until_responsive(
|
||||
timeout=timeout,
|
||||
pause=0.5,
|
||||
pause=pause,
|
||||
check=lambda: is_responsive(container_name, container_port, hostname),
|
||||
)
|
||||
finally:
|
||||
|
||||
38
metadata-ingestion/tests/unit/test_hana_source.py
Normal file
38
metadata-ingestion/tests/unit/test_hana_source.py
Normal file
@ -0,0 +1,38 @@
|
||||
from datahub.ingestion.api.common import PipelineContext
|
||||
from datahub.ingestion.source.sql.hana import HanaConfig, HanaSource
|
||||
|
||||
|
||||
def test_platform_correctly_set_hana():
|
||||
source = HanaSource(
|
||||
ctx=PipelineContext(run_id="hana-source-test"),
|
||||
config=HanaConfig(),
|
||||
)
|
||||
assert source.platform == "hana"
|
||||
|
||||
|
||||
def test_hana_uri_native():
|
||||
config = HanaConfig.parse_obj(
|
||||
{
|
||||
"username": "user",
|
||||
"password": "password",
|
||||
"host_port": "host:39041",
|
||||
"scheme": "hana+hdbcli",
|
||||
}
|
||||
)
|
||||
assert config.get_sql_alchemy_url() == "hana+hdbcli://user:password@host:39041"
|
||||
|
||||
|
||||
def test_hana_uri_native_db():
|
||||
config = HanaConfig.parse_obj(
|
||||
{
|
||||
"username": "user",
|
||||
"password": "password",
|
||||
"host_port": "host:39041",
|
||||
"scheme": "hana+hdbcli",
|
||||
"database": "database",
|
||||
}
|
||||
)
|
||||
assert (
|
||||
config.get_sql_alchemy_url()
|
||||
== "hana+hdbcli://user:password@host:39041/database"
|
||||
)
|
||||
@ -77,6 +77,16 @@
|
||||
"logoUrl": "/assets/platforms/hadooplogo.png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"urn": "urn:li:dataPlatform:hana",
|
||||
"aspect": {
|
||||
"datasetNameDelimiter": ".",
|
||||
"name": "hana",
|
||||
"displayName": "SAP Hana",
|
||||
"type": "RELATIONAL_DB",
|
||||
"logoUrl": "/assets/platforms/hanalogo.png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"urn": "urn:li:dataPlatform:hive",
|
||||
"aspect": {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user