Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Datenqualitätsergebnisse in Datenkatalogtabellen schreiben
Sie können die Evaluierungsläufe von AWS Glue Data Quality so konfigurieren, dass die Ergebnisse automatisch in die Apache Iceberg-Tabellen im AWS Glue Data Catalog geschrieben werden. Nachdem Sie die Ergebnisausgabe aktiviert haben, können Sie Ihre Datenqualitätsergebnisse direkt damit abfragen, Dashboards mit Visualisierungstools erstellen und einen zentralen Verlauf der Datenqualitätsergebnisse in Ihrem gesamten Konto verwalten.
Sie können die folgenden Arten von Datenqualitätsergebnissen in Datenkatalogtabellen schreiben:
-
Regelergebnisse — Das Ergebnis „Bestanden“ oder „Nicht bestanden“ für jede Regel in Ihrem Regelsatz, einschließlich der bewerteten Metriken und Fehlerursachen
-
Ergebnisse der Profilerstellung — Von Analysatoren gesammelte Statistiken, einschließlich Skalarwerten (wie Mittelwert und Standardabweichung) und Verteilungsdaten (Histogramme und Wertverteilungen)
-
Row-level Ergebnisse — Per-record Bewertungsergebnisse, aus denen hervorgeht, welche spezifischen Zeilen in Ihrem Datensatz die einzelnen Regeln bestanden oder nicht bestanden haben
-
Beobachtungsergebnisse — Vorhersagen zur Erkennung von Anomalien, einschließlich erwarteter Werte, Prognosegrenzen und ob der tatsächliche Wert als Anomalie gekennzeichnet wurde
Voraussetzungen
Um Datenqualitätsergebnisse in Datenkatalogtabellen zu schreiben, muss die IAM-Rolle, die Sie für den Evaluierungslauf verwenden, über die folgenden Berechtigungen verfügen:
-
Berechtigung zum Erstellen und Aktualisieren von Datenbanken und Tabellen im AWS Glue-Datenkatalog
-
Erlaubnis, in den Amazon S3-Speicherort zu schreiben, an dem die Daten der Iceberg-Tabelle gespeichert sind
Der Testlauf verwendet die von Ihnen angegebene IAM-Rolle, um in die Ergebnistabellen zu schreiben. Dies ist dieselbe Rolle, die Zugriff auf die Quelldatentabelle hat.
Konfiguration der Ergebnisausgabe
Sie konfigurieren die Ausgabe von Ergebnissen zur Datenqualität mithilfe des --additional-run-options StartDataQualityRulesetEvaluationRun API-Parameters oder des additional_options Parameters in AWS Glue-ETL-Aufträgen. Standardmäßig schreibt AWS Glue Data Quality keine Ergebnisse in Datenkatalogtabellen. Sie müssen jeden Ergebnistyp, den Sie schreiben möchten, explizit aktivieren.
Jeder Ergebnistyp hat seinen eigenen Konfigurationsblock mit einer gemeinsamen CatalogTableConfig Struktur. Wenn Sie keine angebenCatalogTableConfig, leitet AWS Glue Data Quality automatisch Standardwerte ab, einschließlich des Tabellennamens und des Amazon S3-Pfads.
Die CatalogTableConfig Struktur enthält die folgenden Felder:
-
DatabaseName(optional) — Der Name der Katalogdatenbank für die Zieltabelle. Wenn nicht angegeben, wird eine Standarddatenbank erstellt.
-
TableName(optional) — Der Name der Zieltabelle. Wenn nicht angegeben, wird ein Standardtabellenname verwendet.
-
S3Location (optional) — Der Amazon S3-Speicherort, an dem Tabellendaten gespeichert werden. Format:.
s3://Wenn nicht angegeben, werden die Ergebnisse an einem Standardspeicherort gespeichert.amzn-s3-demo-bucket/prefix/ -
CatalogId(optional) — Die ID des AWS Glue-Datenkatalogs, in dem die Tabelle erstellt werden soll. Wenn nicht angegeben, wird standardmäßig die AWS Konto-ID verwendet.
Beispiel: Konfigurieren Sie Regelergebnisse und Profilerstellungsergebnisse
aws glue start-data-quality-ruleset-evaluation-run \ --data-source '{ "GlueTable": { "DatabaseName": "my_database", "TableName": "my_table" } }' \ --role "arn:aws:iam::123456789012:role/GlueServiceRole" \ --ruleset-names '["my_ruleset"]' \ --additional-run-options '{ "DataQualityRuleResults": { "WriteDataQualityRuleResultsEnabled": true, "CatalogTableConfig": { "DatabaseName": "quality_results", "TableName": "rule_results" } }, "ProfilingResults": { "WriteProfilingResultsEnabled": true, "CatalogTableConfig": { "DatabaseName": "quality_results", "TableName": "profiles" } } }'
Beispiel: Ergebnisse auf Zeilenebene konfigurieren
Für Ergebnisse auf Zeilenebene können Sie auch den Typ der einzuschließenden Datensätze und eine maximale Anzahl von Zeilen angeben, die geschrieben werden sollen.
aws glue start-data-quality-ruleset-evaluation-run \ --data-source '{ "GlueTable": { "DatabaseName": "my_database", "TableName": "my_table" } }' \ --role "arn:aws:iam::123456789012:role/GlueServiceRole" \ --ruleset-names '["my_ruleset"]' \ --additional-run-options '{ "RowLevelResults": { "MaxRowsToWrite": 5000, "ResultType": "FAILED_ONLY", "CatalogTableConfig": { "DatabaseName": "quality_results", "TableName": "row_level_results" } } }'
Der Parameter ResultType akzeptiert die folgenden Werte:
-
FAILED_ONLY— Schreiben Sie nur Zeilen, die mindestens eine Datenqualitätsregel nicht erfüllt haben. -
PASSED_ONLY— Schreiben Sie nur Zeilen, die alle Datenqualitätsregeln erfüllt haben. -
ALL— Schreiben Sie alle Zeilen mit ihren Bewertungsergebnissen.
Beispiel — ETL-Jobs in AWS Glue konfigurieren
In AWS Glue-ETL-Jobs konfigurieren Sie die Ergebnisausgabe mithilfe des additional_options Parameters mit Schlüsseln in Punktnotation:
result = EvaluateDataQuality.process_rows( frame=dynamic_frame, ruleset=ruleset, publishing_options={ "dataQualityEvaluationContext": "my_context", "enableDataQualityResultsPublishing": True }, additional_options={ "observations.scope": "ALL", "dataQualityResultsPublishing.strategy": "BEST_EFFORT", "dataQualityResultsPublishing.resultsFormat.profilingResults.writeProfilingResultsEnabled": "true", "dataQualityResultsPublishing.resultsFormat.profilingResults.catalogTableConfig.databaseName": "my_db", "dataQualityResultsPublishing.resultsFormat.profilingResults.catalogTableConfig.tableName": "profiling_results", "dataQualityResultsPublishing.resultsFormat.profilingResults.catalogTableConfig.s3Location": "s3://amzn-s3-demo-bucket/profiling/", "dataQualityResultsPublishing.resultsFormat.profilingResults.catalogTableConfig.catalogId": "123456789012" } )
Beispiel — Beobachtungsergebnisse konfigurieren
Sie können Beobachtungsergebnisse auf die gleiche Weise wie andere Ergebnistypen konfigurieren. Für Beobachtungsergebnisse muss die Anomalieerkennung aktiviert sein (ObservationScope: ALL):
aws glue start-data-quality-ruleset-evaluation-run \ --data-source '{ "GlueTable": { "DatabaseName": "my_database", "TableName": "my_table" } }' \ --role "arn:aws:iam::123456789012:role/GlueServiceRole" \ --ruleset-names '["my_ruleset"]' \ --additional-run-options '{ "ObservationScope": "ALL", "ObservationResults": { "WriteObservationResultsEnabled": true, "CatalogTableConfig": { "DatabaseName": "quality_results", "TableName": "observation_results" } } }'
Tabellenschemas
AWS Glue Data Quality schreibt jeden Ergebnistyp in eine separate Iceberg-Tabelle. Die Regelergebnisse, die Ergebnisse der Profilerstellung (einschließlich der separaten Tabelle mit den Verteilungsergebnissen) und die Tabellen mit den Beobachtungsergebnissen sind durchcatalog_id, und partitioniert database_nametable_name, um effiziente Abfragen day(stored_on) zu ermöglichen. Bei zeitbasierten Abfragen können Sie stored_on direkt nach Daten filtern, und Iceberg führt die Partitionsbereinigung automatisch durch.
Tabelle mit den Ergebnissen der Regel
In der Tabelle mit den Regelergebnissen wird das Ergebnis „Bestanden“ oder „Nicht bestanden“ für jede Regel gespeichert, die während eines Datenqualitätslaufs bewertet wurde.
| Spalte | Typ | Description |
|---|---|---|
dq_result_id |
STRING | Eindeutiger Bezeichner für das Datenqualitätsergebnis. |
rule_name |
STRING | Name der Regel (z. B.Rule_1). |
rule_description |
STRING | Der DQDL-Ausdruck für die Regel. |
rule_result |
STRING | Das Bewertungsergebnis: PASS oderFAIL. |
evaluation_message |
STRING | Eine Meldung, die den Grund für den Ausfall beschreibt, falls zutreffend. |
evaluated_metrics |
LANDKARTE<STRING, DOUBLE> | Die von der Regel bewerteten Metriken. |
catalog_id |
STRING | Die Katalog-ID der Quelltabelle. |
database_name |
STRING | Der Datenbankname der Quelltabelle. |
table_name |
STRING | Der Name der Quelltabelle. |
ruleset_evaluation_run_id |
STRING | Die ID des Testlaufs. |
started_on |
TIMESTAMP (ZEITSTEMPEL) | Wann die Evaluierung gestartet wurde. |
completed_on |
TIMESTAMP (ZEITSTEMPEL) | Wenn die Bewertung abgeschlossen ist. |
evaluated_rule |
STRING | Der ausgewertete Regelausdruck nach der Operandenauflösung. |
ruleset_name |
STRING | Name des Regelsatzes, der dieses Ergebnis erzeugt hat. |
Tabelle mit Ergebnissen der Profilerstellung
In der folgenden Tabelle werden die Spalten in der Tabelle mit den Ergebnissen der Profilerstellung beschrieben. In dieser Tabelle werden skalare Statistiken gespeichert, die von Analysatoren und Regeln (wie MeanStandardDeviation, und) erfasst wurden. Completeness AWS Glue Data Quality speichert die Verteilungsstatistiken in einer separaten Tabelle mit den Verteilungsergebnissen.
| Spalte | Typ | Description |
|---|---|---|
profile_id |
STRING | Eindeutiger Bezeichner für das Datenqualitätsprofil. |
statistic_id |
STRING | Eindeutiger Bezeichner für die Statistik. |
statistic_name |
STRING | Name der Statistik (z. B.,Mean) Completeness |
evaluation_level |
STRING | Die Ebene, auf der die Statistik ausgewertet wird: DatasetColumn, oder. Multicolumn |
statistics_value |
DOUBLE | Der Skalarwert der Statistik. |
statistic_properties |
LANDKARTE<STRING, STRING> | Zusätzliche Eigenschaften der Statistik. |
columns_referenced |
ARRAY <STRING> | Die Spalten, auf die in der Statistik verwiesen wird. |
referenced_datasets |
ARRAY <STRING> | Referenzierte Datensätze für die Statistik. |
column_name |
STRING | Der Name der Zielspalte. |
dq_result_id |
STRING | Identifier für das Ergebnis der Datenqualität. |
started_on |
TIMESTAMP (ZEITSTEMPEL) | Als die Bewertung begann. |
completed_on |
TIMESTAMP (ZEITSTEMPEL) | Wenn die Bewertung abgeschlossen ist. |
stored_on |
TIMESTAMP (ZEITSTEMPEL) | Wann der Datensatz in die Tabelle geschrieben wurde. |
catalog_id |
STRING | Katalog-ID der Quelltabelle. |
database_name |
STRING | Datenbankname der Quelltabelle. |
table_name |
STRING | Name der Quelltabelle. |
region |
STRING | AWS Region. |
account_id |
STRING | AWS Konto-ID. |
ruleset_evaluation_run_id |
STRING | Die ID des Testlaufs. |
Tabelle mit den Ergebnissen der Verteilung
In der folgenden Tabelle werden die Spalten in der Tabelle mit den Verteilungsergebnissen beschrieben. Die Verteilungsergebnisse werden getrennt von den Statistiken zur skalaren Profilerstellung gespeichert, und zwar mit einer Zeile pro Abschnitt oder Kategorie. Sie können diese Tabelle innerhalb des ProfilingResults.DistributionResults Blocks konfigurieren.
| Spalte | Typ | Description |
|---|---|---|
statistic_id |
STRING | Eindeutiger Bezeichner für die Verteilungsstatistik. |
column_name |
STRING | Die Quellspalte (z. B. „Alter“ oder „Abteilung“). |
data_type |
STRING | Der Datentyp der Spalte (z. B. "LongType„," StringType „). |
num_bins |
INT | Anzahl der für die Verteilung verwendeten Fächer. |
bin_index |
INT | Auf 0 basierende Position des Ablagefachs. |
bin_label |
STRING | Für kategoriale Spalten: der eindeutige Wert. NULL für numerische Spalten. |
bin_lower_bound |
STRING | Für numerische Spalten: der untere Rand des Abschnitts. NULL für kategoriale Spalten. |
bin_upper_bound |
STRING | Für numerische Spalten: der obere Rand der Ablage. NULL für kategoriale Spalten. |
bin_count |
BIGINT | Anzahl der Häufigkeiten für diesen Abschnitt. |
null_count |
INT | Anzahl der NULL-Werte, die von der Verteilung ausgeschlossen wurden. Derselbe Wert in jeder Zeile für eine bestimmte Statistik innerhalb eines Durchlaufs. NULL, wenn keine Nullen vorhanden sind. |
tail_count |
INT | Aggregierte Häufigkeit von kategorialen Werten, die über die Top 20 hinausgehen. Derselbe Wert in jeder Zeile für eine bestimmte Statistik innerhalb eines Durchlaufs. NULL für numerische Histogramme. |
profile_id |
STRING | Profil-ID. |
dq_result_id |
STRING | Kennung des Ergebnisses zur Datenqualität. |
ruleset_evaluation_run_id |
STRING | Identifier für den Bewertungslauf. |
started_on |
TIMESTAMP (ZEITSTEMPEL) | Wann die Evaluierung gestartet wurde. |
completed_on |
TIMESTAMP (ZEITSTEMPEL) | Wenn die Bewertung abgeschlossen ist. |
stored_on |
TIMESTAMP (ZEITSTEMPEL) | Wann der Datensatz in die Tabelle geschrieben wurde. |
catalog_id |
STRING | Katalog-ID der Quelltabelle. |
database_name |
STRING | Datenbankname der Quelltabelle. |
table_name |
STRING | Name der Quelltabelle. |
region |
STRING | AWS Region. |
account_id |
STRING | AWS Konto-ID. |
Row-level Tabelle mit Ergebnissen
In der folgenden Tabelle werden die Spalten in der Ergebnistabelle auf Zeilenebene beschrieben. Sie können diese Tabelle verwenden, um die spezifischen Datensätze zu identifizieren, die Ihre Datenqualitätsregeln nicht erfüllt haben.
| Spalte | Typ | Description |
|---|---|---|
| Quellspalten | Variiert | Alle Spalten aus den ursprünglichen Quelldaten. |
data_quality_rules_pass |
REIHE <STRING> | Regeln, die für diesen Datensatz bestanden wurden. |
data_quality_rules_fail |
ARRAY <STRING> | Regeln, die für diesen Datensatz fehlgeschlagen sind. |
data_quality_rules_skip |
ARRAY <STRING> | Regeln, die für diesen Datensatz übersprungen wurden. |
data_quality_evaluation_result |
STRING | Das gesamte Bewertungsergebnis für diesen Datensatz: Passed oderFailed. |
dq_result_id |
STRING | Eindeutiger Bezeichner für das Datenqualitätsergebnis. |
ruleset_evaluation_run_id |
STRING | Die ID des Testlaufs. |
started_on |
TIMESTAMP (ZEITSTEMPEL) | Wann die Evaluierung gestartet wurde. |
completed_on |
TIMESTAMP (ZEITSTEMPEL) | Wenn die Bewertung abgeschlossen ist. |
stored_on |
TIMESTAMP (ZEITSTEMPEL) | Wann der Datensatz in die Tabelle geschrieben wurde. |
catalog_id |
STRING | Katalog-ID der Quelltabelle. |
database_name |
STRING | Datenbankname der Quelltabelle. |
table_name |
STRING | Name der Quelltabelle. |
region |
STRING | AWS Region. |
account_id |
STRING | AWS Konto-ID. |
Tabelle mit den Beobachtungsergebnissen
In der Tabelle mit den Beobachtungsergebnissen werden Vorhersagen zur Erkennung von Anomalien für jede Statistik bei jedem Bewertungslauf gespeichert. Die Tabelle enthält alle Prognoseergebnisse: Anomalien, Normalwerte und übersprungene Vorhersagen. Auf diese Weise können Sie kontinuierliche Trenddiagramme mit Prognosebändern rendern.
| Spalte | Typ | Description |
|---|---|---|
statistic_id |
STRING | Bezeichner für die Statistik, die überwacht wird. |
statistic_name |
STRING | Name der überwachten Statistik. |
prediction_outcome |
STRING | Das Ergebnis der Anomalieerkennung:ANOMALY,NOT_ANOMALY, oder. SKIPPED |
expected_value |
DOUBLE | Der vorhergesagte Erwartungswert. NULL, wenn die Vorhersage übersprungen wird. |
lower_bound |
DOUBLE | Die Untergrenze des vorhergesagten Bereichs. NULL, wenn die Vorhersage übersprungen wird. |
upper_bound |
DOUBLE | Die Obergrenze des vorhergesagten Bereichs. NULL, wenn die Vorhersage übersprungen wird. |
observation_message |
STRING | Eine Beschreibung der Anomalie, falls sie erkannt wurde. |
training_input |
STRING | Ob dieser Datenpunkt im Anomalieerkennungsmodell enthalten ist: INCLUDED oder. EXCLUDED |
ruleset_evaluation_run_id |
STRING | Die ID des Testlaufs. |
recorded_on |
TIMESTAMP (ZEITSTEMPEL) | Wann die Beobachtung aufgezeichnet wurde. |
stored_on |
TIMESTAMP (ZEITSTEMPEL) | Als der Datensatz in die Tabelle geschrieben wurde. |
actual_value |
DOUBLE | Der tatsächlich beobachtete Wert für die Statistik. |
training_status |
STRING | Status des Trainings des Modells zur Erkennung von Anomalien (z. B.PENDING,COMPLETED). |
recommended_rules |
STRING | Auf der Grundlage der Vorhersage der Anomalieerkennung empfohlene Regeln. |
modified_rules |
STRING | Die Regeln wurden geändert und die Schwellenwerte wurden auf der Grundlage von Vorhersagen aktualisiert. |
catalog_id |
STRING | Katalog-ID der Quelltabelle. |
database_name |
STRING | Datenbankname der Quelltabelle. |
table_name |
STRING | Name der Quelltabelle. |
Anmerkung
Die Tabelle mit den Beobachtungsergebnissen verwendet ein Schreibmodell, das nur zum Anhängen verwendet wird. Wenn Sie einen Datenpunkt mithilfe der BatchPutDataQualityStatisticAnnotation API ausschließen, wird eine neue Zeile mit training_input set to angehängt. EXCLUDED Um den neuesten Status jeder Beobachtung abzufragen, verwenden Sie den stored_on Zeitstempel, um die neueste Zeile für jede Kombination aus Statistik und Rechenlauf zu identifizieren.
Anmerkung
In dieser Tabelle werden auch Verteilungsüberlaufbeobachtungen gespeichert, die generiert werden, wenn mehr als 2% der Werte außerhalb der Grenzen der eingefrorenen Abschnitte liegen. Diese Zeilen haben statistic_name = 'Distribution' und sind prediction_outcome NULL. Das observation_message Feld enthält die Beschreibung des Überlaufs.
Ergebnisse abfragen mit
Nach Abschluss der Bewertung der Datenqualität können Sie die Ergebnistabellen direkt mit abfragen. Die folgenden Beispiele veranschaulichen gängige Abfragemuster.
Beispiel: Finden Sie fehlgeschlagene Regeln für einen bestimmten Lauf
SELECT rule_name, rule_description, evaluation_message, evaluated_metrics FROM quality_results.rule_results WHERE ruleset_evaluation_run_id = 'dqr-12345678' AND rule_result = 'FAIL' ORDER BY rule_name;
Beispiel: Profilstatistiken im Zeitverlauf anzeigen
SELECT stored_on, statistics_value FROM quality_results.profiles WHERE database_name = 'my_database' AND table_name = 'my_table' AND statistic_name = 'Mean' AND columns_referenced = ARRAY['salary'] ORDER BY stored_on;
Beispiel — Identifizieren Sie Zeilen, die eine bestimmte Regel nicht erfüllt haben
SELECT * FROM quality_results.row_level_results WHERE data_quality_evaluation_result = 'Failed' AND contains(data_quality_rules_fail, 'IsComplete "email"');
Beispiel — Zeigen Sie ein numerisches Histogramm an
SELECT bin_index, bin_lower_bound, bin_upper_bound, bin_count FROM quality_results.distributions WHERE column_name = 'salary' AND ruleset_evaluation_run_id = 'dqrun-abc123' ORDER BY bin_index;
Beispiel — Eine kategoriale Wertverteilung anzeigen
SELECT bin_label, bin_count FROM quality_results.distributions WHERE column_name = 'department' AND ruleset_evaluation_run_id = 'dqrun-abc123' ORDER BY bin_count DESC;
Beispiel — Verfolgen Sie die Häufigkeit von Kategorien im Zeitverlauf
SELECT started_on, bin_count FROM quality_results.distributions WHERE column_name = 'status' AND bin_label = 'active' ORDER BY started_on;
Beispiel: Lassen Sie sich Trends bei der Erkennung von Anomalien anhand von Prognosebändern anzeigen
SELECT o.recorded_on, p.statistics_value AS actual_value, o.expected_value, o.lower_bound, o.upper_bound, o.prediction_outcome FROM quality_results.profiles p JOIN quality_results.observation_results o ON p.statistic_id = o.statistic_id AND p.ruleset_evaluation_run_id = o.ruleset_evaluation_run_id WHERE p.database_name = 'my_database' AND p.table_name = 'my_table' AND p.statistic_name = 'RowCount' AND p.stored_on >= DATE '2025-03-01' ORDER BY p.stored_on;
Beispiel — Fragt den neuesten Beobachtungsstatus nach Anmerkungen ab
Da in der Tabelle mit den Beobachtungsergebnissen ein Modell verwendet wird, das nur zum Anhängen dient, werden durch Ausschlussanmerkungen neue Zeilen hinzugefügt. Verwenden Sie eine Deduplizierungsabfrage, um den neuesten Status für jede Beobachtung abzurufen:
SELECT statistic_id, statistic_name, prediction_outcome, expected_value, lower_bound, upper_bound, training_input, stored_on FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY statistic_id, ruleset_evaluation_run_id ORDER BY stored_on DESC ) AS rn FROM quality_results.observation_results WHERE database_name = 'my_database' AND table_name = 'my_table' ) WHERE rn = 1 ORDER BY stored_on;
Überlegungen
Beachten Sie beim Schreiben von Datenqualitätsergebnissen in Datenkatalogtabellen die folgenden Überlegungen:
-
AWS Glue Data Quality speichert Ergebnisse im Apache Iceberg-Format, das effiziente Abfragen von Zeitreisen und das Bereinigen von Partitionen unterstützt.
-
In einer einzelnen Ergebnistabelle können Ergebnisse aus mehreren Quelltabellen gespeichert werden. Verwenden Sie die
table_namePartitionsspaltencatalog_iddatabase_name, und, um Ergebnisse nach einer bestimmten Quelle zu filtern. -
AWS Glue Data Quality schreibt die Beobachtungsergebnisse asynchron, nachdem der Bewertungslauf abgeschlossen ist. Es kann eine kurze Verzögerung geben, bis die Beobachtungen in der Tabelle erscheinen.
-
Für Verteilungsstatistiken in der Tabelle mit den Verteilungsergebnissen wird jeder Abschnitt oder jede Kategorie als separate Zeile gespeichert. Beispielsweise generiert ein Histogramm mit 20 Abschnitten 20 Zeilen in der Tabelle für diese Statistik.