Walidacja i debugowanie transformacji danych
Programiści i inni specjaliści zajmujący się danymi często muszą przekształcać dane z jednego formatu na inny. Te transformacje mogą być prostymi, bezpośrednimi konwersjami, ale mogą również wymagać bardziej złożonych operacji. Na przykład, podczas importowania plików CSV do bazy danych, konieczne jest generowanie relacji, lub dane źródłowe mogą wymagać podziału, jak w przypadku pełnego imienia i nazwiska, które musi zostać rozdzielone na imię, drugie imię (jeśli występuje) i nazwisko, a także opcjonalny dodatek. Walidacja transformacji danych jest kluczowa, aby zapobiec utracie lub uszkodzeniu danych.
W wcześniejszym wpisie na temat integracji danych z usług sieciowych, połączyliśmy wartość tekstową reprezentującą czas GMT z wartością numeryczną oznaczającą przesunięcie w sekundach, aby wygenerować lokalny czas używany do prognoz pogody. Stworzyliśmy funkcję użytkownika, która realizowała wszystkie kroki niezbędne do wykonania tej operacji. MapForce zawiera potężny, interaktywny debugger mapowania danych, który pozwala łatwo śledzić i weryfikować tę transformację. Przyjrzyjmy się, jak to działa.

Oto sposób działania funkcji użytkownika "calc-local-time" w naszym projekcie transformacji danych. Jak widać, MapForce umożliwia mapowanie danych bez użycia kodu, dzięki intuicyjnemu interfejsowi graficznemu z funkcją przeciągania i upuszczania.

Funkcja przyjmuje dwa argumenty: dt_txt, który jest ciągiem znaków reprezentującym datę i godzinę w formacie RRRR-MM-DD GG:MM:SS (np. 2020-02-22 18:00:00), oraz wartość numeryczną wskazującą strefę czasową, czyli przesunięcie od czasu GMT dla lokalizacji, dla której prognoza jest generowana, wyrażone w sekundach.
Po przetworzeniu danych, wynik działania funkcji jest umieszczany w kolumnie A arkusza kalkulacyjnego Excel. Wewnątrz arkusza, format kolumny A jest zdefiniowany jako data, a format ten obejmuje również godzinę, jak w przykładzie: 20.05.2020, 16:00.
Kliknięcie dwukrotnie nagłówka funkcji użytkownika powoduje jej rozwinięcie, co pozwala zobaczyć poszczególne operacje zawarte w tej funkcji

Dwie wartości wejściowe znajdują się po prawej stronie, a wynikowa wartość oznaczona literą A znajduje się po lewej. Mówiąc prościej, funkcja dodaje do daty i godziny zawartej w zmiennej dt_txt liczbę sekund odpowiadającą strefie czasowej, aby obliczyć lokalny czas. MapForce zawiera wbudowaną funkcję datetime-add, która wykonuje tę operację, jak widać na obrazku powyżej, tuż po lewej stronie wartości wyjściowej A. Ale nic nie jest tak proste, jak się wydaje! Wartości wejściowe otrzymywane z usługi internetowej mogą być w różnych formatach i muszą zostać dostosowane do formatu i składni funkcji datetime-add.
Weryfikacja transformacji danych za pomocą debugera MapForce
Możemy użyć programu MapForce debugger transformacji danych Aby sprawdzić, czy funkcja użytkownika działa poprawnie i daje oczekiwany rezultat, prześledźmy jej działanie. Najpierw ustawimy punkt przerwania debugowania, klikając prawym przyciskiem myszy na polu wprowadzania strefy czasowej:

Otwierane są okna pomocnicze do debugowania, a proces transformacji trwa do momentu osiągnięcia punktu przerwania. Wartość przetwarzana w punkcie przerwania jest wyróżniona:

Mamy kilka opcji kontynuacji działania. Opcja "Minimalny krok" zapewnia najbardziej szczegółowy przegląd każdego etapu transformacji danych.

To polecenie dzieli krok na mniejsze podkroki i zazwyczaj zatrzymuje się dwukrotnie dla każdego połączenia: raz, gdy źródło generuje wartość, i raz, gdy cel ją przetwarza. Wielokrotne klikanie opcji "Minimalny krok" kontynuuje wykonywanie transformacji i pozwala nam zobaczyć dokładnie, co się dzieje podczas przetwarzania przez funkcję calc-local-time:

W miarę kontynuowania procesu wykonywania, wartości przypisane do każdego połączenia są dodawane do okna.
Funkcja datetime-add, która jest wbudowana, wymaga wartości daty i czasu jako pierwszego argumentu oraz ciągu znaków określającego okres czasu, który ma zostać dodany, jako drugiego argumentu. Na poniższym obrazku pokazano krok po kroku cały proces, aż do uzyskania końcowego wyniku. Podkreślone są argumenty przekazywane do funkcji datetime-add oraz ostateczny wynik:

Wartość początkowa przesunięcia dla sekund wynosi 28 800 sekund, co odpowiada ośmiu godzinom. Wynik, który został wygenerowany, jest o osiem godzin późniejszy niż referencyjny czas dt_txt, więc wynik jest prawidłowy.
Rozważając inne przypadki
Różnica względem czasu GMT będzie dodatnia tylko dla lokalizacji położonych na wschód od linii Greenwich. Lokalizacje położone na zachód od linii Greenwich powinny mieć różnicę ujemną. Innymi słowy, Nowy Jork znajduje się na zachód od Londynu, a lokalny czas jest wcześniejszy. Pekin znajduje się na wschód od linii Greenwich, a lokalny czas jest późniejszy.
Musimy przetestować funkcję calc-local-time w przypadku, gdy przesunięcie strefy czasowej jest ujemne.
Istnieje kilka sposobów, aby to osiągnąć. Nasza lista lokalizacji zawiera zarówno miejsca położone na wschód od strefy czasowej GMT, jak i na zachód. Możemy kontynuować proces wykonywania, aż napotkamy lokalizację o ujemnej różnicy czasu.

Usługa internetowa zwraca 40 prognoz dla każdego miasta, więc przechodzenie przez wszystkie prognozy dla pierwszych czterech miast byłoby czasochłonne.
Możemy zmodyfikować listę miast, dodając nowe miasto z zachodniej półkuli na jej początku, albo możemy utworzyć nowy plik wejściowy dla konkretnego przypadku testowego. W wielu sytuacjach to rozsądna strategia testowania.
Alternatywnie, możemy ustawić warunek zatrzymania. Jeśli uda nam się ustawić punkt zatrzymania tak, aby program zatrzymywał się tylko wtedy, gdy napotka wartość ujemną, możemy kontynuować pracę z naszym oryginalnym plikiem wejściowym. To będzie najszybszy sposób na wyciągnięcie ostatecznego wniosku.
Wracając do mapowania danych, klikamy prawym przyciskiem myszy na punkcie przerwania, aby zmodyfikować jego właściwości:

Otwiera to okno dialogowe, w którym możemy ustawić warunek, aby punkt przerwania był aktywny tylko w określonych sytuacjach. Na poniższym obrazku pokazany jest warunek, który powoduje zatrzymanie działania programu, jeśli wartość strefy czasowej jest ujemna:

Teraz możemy ponownie uruchomić proces mapowania w trybie debugowania. Najpierw przetwarzane są pierwsze miasta z listy wejściowej, które znajdują się na wschód od strefy czasowej GMT. Gdy napotkamy pierwszą ujemną wartość strefy czasowej, zostanie aktywowany punkt przerwania, a wykonanie zostanie wstrzymane.

Korzystając z tej samej metody krok po kroku, o której mowa powyżej, możemy śledzić, co dzieje się z wartością ujemną w trakcie działania funkcji calc-local-time.

Wartość strefy czasowej, wyrażona w sekundach (-25200), jest konwertowana na ciąg znaków. Następnie wbudowana funkcja concat dodaje znaki na początku i na końcu, tworząc ciąg znaków reprezentujący czas trwania, który jest wykorzystywany przez funkcję datetime-add.
Dodanie wartości ujemnej jest równoznaczne z odejmowaniem, ale w tym momencie składnia dotycząca czasu trwania nie jest jeszcze w pełni poprawna. Znak minus (myślnik) musi być pierwszym znakiem ciągu znaków określającego czas trwania. Dlatego funkcja zamiany wyszukuje w ciągu znaków sekwencję "PT-" i, jeśli ją znajdzie, zastępuje ją sekwencją "-PT".
Wartość 25 200 sekund to siedem godzin. Odejmując siedem godzin od wartości początkowej 2020-05-23T00:00:00, otrzymujemy 2020-05-22T17:00:00, czyli 22 maja 2020 roku, godzina 17:00. W ten sposób zweryfikowaliśmy działanie funkcji dla przypadków z przesunięciami zarówno dodatnimi, jak i ujemnymi.
Niezależnie od tego, czy weryfikujesz poprawność transformacji danych, czy też próbujesz zidentyfikować nieoczekiwany wynik, debugowanie konwersji i transformacji danych w MapForce zapewnia dogłębną wiedzę na temat szczegółowego działania projektów integracji danych i procesów ETL, w sposób, który wcześniej był niemożliwy, nawet w znacznie droższych narzędziach do mapowania danych.
Obejrzyj krótki film demonstracja wideo programu MapForce, lub Pobierz bezpłatną wersję próbną w tym samouczki, pomoc i wiele przykładów, które pomogą rozpocząć pracę nad własnym projektem związanym z integracją danych JSON i usług internetowych, a także w przypadku innych potrzeb związanych z mapowaniem, konwersją i transformacją danych!