Sunday, 26 November 2017

Mysql moving average example


Uzyskiwanie listy unikatowych wartości z kolumny MySQL Czy chcesz uzyskać listę wszystkich różnych wartości w kolumnie Użyj słowa kluczowego DISTINCT. Oto przykład: (napisany 2005-04-14, zaktualizowany 2006-06-05) Powiązane tematy są indeksowane jak poniżej, lub wpisz melksh. amnnnn dla poszczególnych artykułów S157 - Więcej komend MySQL 4481 Wyodrębnianie danych z kopii zapasowych w celu przywrócenia wybranych wierszy z MySQL tabele - (2018-05-01) 3270 SQL - Dane v Metadane i różne etapy selekcji danych - (2017-04-29) 3061 Bazy danych - dlaczego dane są podzielone na oddzielne tabele i jak się do nich przyłączyć - (2017 -11-20) 2647 Usuwanie duplikatów z tabeli MySQL - (2017-02-22) 2645 Optymalizowanie i buforowanie zapytań MySQL - (2017-02-22) 2644 Zliczanie wierszy w połączonych tabelach MySQL - (2017-02-22) 2643 Powiązanie tabel z połączeniami w MySQL - (2017-02-21) 2448 MySQL - wydajność i inne tematy - (2009-10-10) 2259 Grupowanie wierszy raportu podsumowującego - MySQL i PHP - (2009-06-27) 2110 MySQL - szukanie rekordów w jednej tabeli, które NIE odpowiadają rekordom w innej tabeli - (2009-03-31) 1904 Ruby, Perl, Linux, MySQL - niektóre notatki szkoleniowe - (2008-11-23) 1735 Szukanie wor Granice ds i pracy (MySQL, Perl, PHP) - (2008-08-03) 1574 Ponowne łączenie tabel MySQL - wyszukiwanie rekordów nonmatchowych itp - (2008-03-15) 1331 MySQL dołącza do rewizytów - (2007-09-03) 1235 Wyprowadzanie liczb jako słów - MySQL z Perlem lub PHP - (2007-06-17) 1213 MySQL - kolejność klauzul i kolejność działań - (2007-06-01) 673 Widoki śmigłowca i tartany - (2006-04- 06) 591 Najważniejsze fakty - SQL i MySQL - (2006-02-04) 581 Zapisywanie wyników zapytania MySQL na twój dysk lokalny dla Excela - (2006-01-29) 572 Dawanie autorowi mocy nad analizą bazy danych - (2006-01 -22) 567 Łączenie podobnych wierszy z bazy danych MySQL select - (2006-01-17) 517 Okazjonalna szansa i redukcja danych do możliwych do opanowania poziomów - (2005-12-04) 515 MySQL - FAQ (2005-12- 03) 513 MySQL - JOIN lub WHERE aby poprawnie łączyć tabele - (2005-12-01) 502 SELECT w MySQL - wybór żądanych wierszy - (2005-11-22) 494 MySQL - ilość rzeczy do zapamiętania - (2005 -11-12) 449 Dopasowanie w MySQL - (2005-09-24) 159 MySQL - Optimis ing Selects - (2004-12-21) 158 MySQL - LEWY DOŁĄCZ DO PRAWA, DOŁĄCZ DO WEJŚCIA i DOŁĄCZ DO ZEWNĄTRZ - (2004-12-20) Inne artykuły 4724 posty, strona za stroną Jest to strona zarchiwizowana z The Horses Mouth na wellhohorse - dziennik i pisma Grahama Ellisa. Podjęto każdą próbę dostarczenia aktualnych informacji w czasie, gdy strona została napisana, ale w naszej firmie postępują kolejne - nowe wersje oprogramowania, zmiany cen, nowe techniki. Sprawdź ponownie za pośrednictwem naszej strony głównej, aby zapoznać się z aktualnymi kursami, cenami, wersjami itp. - każda wzmianka o cenie w The Horses Mouth nie może być traktowana jako oferta do dostarczenia w tej cenie. Dziękujemy za odwiedzenie nas. Nie zapewniamy sponsorowania ani zaproszeń na nasze kursy w celu obsługi wniosków UK Visa. Jeśli chcesz zarezerwować którykolwiek z naszych kursów i jesteś obywatelem Ukrainy, sprawdź w lokalnym konsulacie brytyjskim i dokonaj niezbędnych ustaleń wizowych przed dokonaniem rezerwacji. Więcej Komentarz Colina (opublikowany 2017-10-08) Sugerowany link. Nie widziałem twojej witryny w wynikach wyszukiwania sql od lat. I tę stronę znalazłem szukając rozwiązania nieco innego problemu: potrzebuję listy unikalnych wartości ORAZ identyfikatora. Każdy id będzie to robić. Pierwszy lub ostatni. Więc jak z tabeli: Jak zwrócić odrębne miejsce docelowe wraz z tid Wybierz tid, dowolny tid stackoverflow ma podobny problem. Podaję link. Moja kolumna, którą chcę unikatowa, ma ciężkie kalki, więc staram się unikać wielu wyborów i łączeń w miarę możliwości. 3783 Średnia pozycja strony - 4.0Hoop przykład: Hello World z Java, Pig, Hive, Flume, Fuse, Oozie i Sqoop z Informix, DB2 i MySQL Istnieje wiele emocji na temat Big Data i wiele zamieszania, aby przejść z to. W tym artykule zawarto roboczą definicję Big Data, a następnie opracowano szereg przykładów, dzięki czemu można z pierwszej ręki zrozumieć niektóre z możliwości Hadoop, wiodącej technologii Open Source w domenie Big Data. W szczególności skupmy się na następujących pytaniach. Czym są Big Data, Hadoop, Sqoop, Hive i Pig, i dlaczego jest tak wiele emocji w tej przestrzeni Jak Hadoop odnosi się do IBM DB2 i Informix Czy technologie te mogą być ze sobą połączone Jak zacząć z Big Data Jakie są łatwe przykłady, które działają na jednym komputerze Dla super niecierpliwych, jeśli możesz już zdefiniować Hadoop i chcesz uzyskać prawo do pracy nad próbkami kodu, wykonaj następujące czynności. Uruchom usługę Informix lub instancję DB2. Pobierz obraz VMWare ze strony Cloudera i zwiększ pamięć RAM maszyny wirtualnej do 1,5 GB. Przejdź do sekcji zawierającej próbki kodu. W obrazie VMWare wbudowana jest instancja MySQL. Jeśli wykonujesz ćwiczenia bez połączenia sieciowego, skorzystaj z przykładów MySQL. Dla wszystkich, czytaj dalej. Co to jest Big Data Big Data jest duża pod względem ilości, jest przechwytywana w szybkim tempie i ma strukturę strukturalną lub niestrukturalną lub jest kombinacją powyższych. Czynniki te utrudniają przechwytywanie, kopanie i zarządzanie Big Data przy użyciu tradycyjnych metod. W tej przestrzeni panuje tak dużo szumu, że debata na temat definicji dużych zbiorów danych może się przeciągnąć. Korzystanie z technologii Big Data nie ogranicza się do dużych wolumenów. Przykłady w tym artykule wykorzystują małe próbki, aby zilustrować możliwości tej technologii. Od roku 2017 klastry, które są duże, mają zasięg 100 petabajtów. Big Data może być zarówno uporządkowany, jak i nieustrukturyzowany. Tradycyjne relacyjne bazy danych, takie jak Informix i DB2, zapewniają sprawdzone rozwiązania dla danych strukturalnych. Dzięki rozszerzalności zarządzają również nieuporządkowanymi danymi. Technologia Hadoop oferuje nowe i bardziej dostępne techniki programowania do pracy z ogromnymi zbiorami danych z danymi strukturalnymi i niestrukturalnymi. Dlaczego wszystkie emocje Istnieje wiele czynników wpływających na szum wokół Big Data, w tym następujące. Wprowadzanie obliczeń i przechowywanie razem na towarowym sprzęcie: Rezultatem jest niesamowita prędkość przy niskich kosztach. Wydajność cenowa: Technologia dużych zbiorów danych Hadoop zapewnia znaczne oszczędności (około 10) przy znacznej poprawie wydajności (ponownie 10 czynnik). Twój przebieg może się różnić. Jeśli istniejąca technologia może być tak dramatycznie podważona, warto sprawdzić, czy Hadoop może uzupełnić lub zastąpić aspekty obecnej architektury. Skalowalność liniowa: każda technologia równoległa generuje roszczenia dotyczące skali. Hadoop ma prawdziwą skalowalność, ponieważ najnowsza wersja rozszerza limit liczby węzłów do ponad 4000. Pełny dostęp do niestrukturalnych danych: wysoce skalowalny magazyn danych z dobrym równoległym modelem programowania, MapReduce, od pewnego czasu stanowi wyzwanie dla branży. Model programowania Hadoops nie rozwiązuje wszystkich problemów, ale jest silnym rozwiązaniem dla wielu zadań. Dystrybucje Hadoop: IBM i Cloudera Jednym z punktów dezorientacji jest: Gdzie mogę uzyskać oprogramowanie do pracy z Big Data Przykłady w tym artykule oparte są na darmowej dystrybucji Cloudera Hadoop zwanej CDH (dla dystrybucji Cloudera zawierającej Hadoop). Jest dostępny jako obraz VMWare z witryny Cloudera. IBM ogłosił niedawno, że przenosi swoją platformę dużych zbiorów danych na CDH. Termin technologia destrukcyjna jest nadużywana, ale w tym przypadku może być odpowiednia. Co to jest Hadoop? Poniżej przedstawiono kilka definicji Hadoop, z których każda skierowana jest do różnych odbiorców w przedsiębiorstwie: Dla menedżerów: Hadoop jest projektem oprogramowania open source Apache, aby uzyskać wartość od niesamowitej ilości danych dotyczących organizacji. Użyj danych zamiast wyrzucać większość z nich. Dla menedżerów technicznych: pakiet oprogramowania typu open source, który kopie ustrukturyzowane i nieustrukturyzowane BigData dotyczące Twojej firmy. Integruje się z istniejącym ekosystemem Business Intelligence. Legal: Pakiet oprogramowania typu open source, który jest pakowany i obsługiwany przez wielu dostawców. Inżynieria: masywnie równoległa, nic nie współdzielona, ​​mapa oparta na Javie - redukuje środowisko wykonywania. Pomyśl o setkach do tysięcy komputerów pracujących nad tym samym problemem, z wbudowaną odpornością na awarie. Projekty w ekosystemie Hadoop zapewniają ładowanie danych, języki wyższego poziomu, zautomatyzowane wdrażanie w chmurze i inne funkcje. Bezpieczeństwo: pakiet oprogramowania zabezpieczony protokołem Kerberos. Jakie są składniki Hadoop Projekt Apache Hadoop ma dwa podstawowe komponenty: magazyn plików o nazwie Hadoop Distributed File System (HDFS) oraz framework programistyczny o nazwie MapReduce. Istnieje wiele projektów wspierających, które wykorzystują HDFS i MapReduce. Ten artykuł zawiera podsumowanie i zachęca, aby uzyskać bardziej szczegółowy przewodnik Hadoop The Definitive Guide, 3rd Edition. Poniższe definicje mają zapewnić wystarczającą ilość tła, aby można było skorzystać z poniższych przykładów kodu. Ten artykuł ma na celu rozpoczęcie z praktycznym doświadczeniem w tej technologii. Jest to artykuł instruktażowy, który nie jest artykułem typu "co jest" lub "omawiajmy". HDFS. Jeśli chcesz, aby 4000 komputerów działało na twoich danych, lepiej rozpowszechniaj dane na 4000 komputerów. HDFS robi to za Ciebie. HDFS ma kilka ruchomych części. Datanodes przechowuje twoje dane, a Namenode śledzi miejsce przechowywania danych. Są inne elementy, ale masz dość, by zacząć. MapReduce. To jest model programowania dla Hadoop. Są dwie fazy, co nie jest zaskakujące, o nazwie Map i Reduce. Aby zaimponować znajomym, powiedz im, że istnieje sortowanie między fazą mapy a fazą redukcji. JobTracker zarządza 4000 elementami twojej pracy MapReduce. TaskTrackers przyjmują zamówienia od JobTracker. Jeśli lubisz Javę, to koduj w Javie. Jeśli lubisz SQL lub inne języki inne niż Java, masz szczęście, możesz użyć narzędzia o nazwie Hadoop Streaming. Hadoop Streaming. Narzędzie do włączania kodu MapReduce w dowolnym języku: C, Perl, Python, C, Bash itd. Przykłady obejmują program odwzorowujący Pythona i reduktor AWK. Hive i Hue. Jeśli lubisz SQL, z przyjemnością usłyszysz, że możesz napisać SQL i Hive przekonwertować go do zadania MapReduce. Nie, nie dostaniesz pełnego środowiska ANSI-SQL, ale otrzymujesz 4000 notatek i skalowalność wielu petabajtów. Hue oferuje interfejs graficzny oparty na przeglądarce, który umożliwia pracę Hive. Świnia . Środowisko programowania wyższego poziomu do kodowania MapReduce. Język Pig nazywa się Pig Latin. Konwencje nazewnictwa mogą być nieco niekonwencjonalne, ale zapewniasz niesamowitą wydajność cenową i wysoką dostępność. Sqoop. Zapewnia dwukierunkowy transfer danych między Hadoop i twoją ulubioną relacyjną bazą danych. Oozie. Zarządza przepływem pracy Hadoop. Nie zastąpi to twojego harmonogramu ani narzędzi BPM, ale zapewnia rozgałęzienia if-then-else i kontrolę w twoich zadaniach Hadoop. HBase. Skalowalny magazyn kluczy i wartości. Działa bardzo podobnie do trwałej mapy hash (dla języka python fans think dictionary). Nie jest relacyjną bazą danych pomimo nazwy HBase. FlumeNG. Ładowarka w czasie rzeczywistym do przesyłania danych do Hadoop. Przechowuje dane w HDFS i HBase. Będziesz chciał zacząć od FlumeNG, który ulepsza oryginalny flume. Whirr. Obsługa administracyjna w chmurze dla Hadoop. Możesz uruchomić klaster w ciągu zaledwie kilku minut za pomocą bardzo krótkiego pliku konfiguracyjnego. Mahout. Uczenie maszynowe dla Hadoop. Służy do analizy predykcyjnej i innych zaawansowanych analiz. Bezpiecznik. Sprawia, że ​​system HDFS wygląda jak zwykły system plików, dzięki czemu można używać ls, rm, cd i innych na ZOO danych HDFS. Służy do zarządzania synchronizacją klastra. Nie będziesz dużo pracował z Zookeeperem, ale ciężko pracuje dla ciebie. Jeśli uważasz, że musisz napisać program, który używa Zookeepera, to jesteś bardzo, bardzo, inteligentny i może to być komitet do projektu Apache, albo masz bardzo zły dzień. Rysunek 1 pokazuje kluczowe elementy Hadoop. Rysunek 1. Hadoop architektura HDFS, dolna warstwa, znajduje się w grupie sprzętu towarowego. Proste serwery montowane w stelażu, każdy z procesorami 2-Hex, 6 do 12 dysków i 32 gigabajtowym ram. W celu zmniejszenia liczby map warstwa mapera odczytuje dane z dysków z bardzo dużą prędkością. Mapper emituje pary wartości kluczy, które są sortowane i prezentowane dla reduktora, a warstwa redukująca podsumowuje pary klucz-wartość. Nie, nie musisz podsumowywać, możesz faktycznie mieć zadanie zmniejszania mapy, które ma tylko twórców map. To powinno stać się łatwiejsze do zrozumienia, gdy dojdziesz do przykładu Pythona-awka. W jaki sposób Hadoop integruje się z moją infrastrukturą Informix lub DB2 Hadoop bardzo dobrze integruje się z bazami danych Informix i DB2 z Sqoop. Sqoop jest wiodącą implementacją open-source do przenoszenia danych między Hadoop i relacyjnymi bazami danych. Używa JDBC do odczytu i zapisu produktu Informix, DB2, MySQL, Oracle i innych źródeł. Istnieją zoptymalizowane adaptery dla kilku baz danych, w tym Netezza i DB2. Pierwsze kroki: Jak uruchomić proste przykłady Hadoop, Hive, Pig, Oozie i Sqoop Skończyłeś z wprowadzaniem i definicjami, teraz czas na dobre rzeczy. Aby kontynuować, musisz pobrać VMWare, wirtualną skrzynkę lub inny obraz z witryny Cloudera i zacząć robić MapReduce Obraz wirtualny zakłada, że ​​masz 64-bitowy komputer i jedno z popularnych środowisk wirtualizacyjnych. Większość środowisk wirtualizacji jest dostępna bezpłatnie. Podczas próby uruchomienia 64-bitowego obrazu wirtualnego mogą pojawić się skargi dotyczące ustawień systemu BIOS. Rysunek 2 pokazuje wymaganą zmianę w BIOS-ie, w tym przypadku na Thinkpad8482. Zachowaj ostrożność podczas wprowadzania zmian. Niektóre pakiety zabezpieczeń korporacyjnych będą wymagać hasła po zmianie systemu BIOS, zanim system zostanie zrestartowany. Rysunek 2. Ustawienia systemu BIOS dla 64-bitowego wirtualnego gościa Wielkie dane używane tutaj są w rzeczywistości niewielkie. Nie chodzi o to, aby twój laptop się zapalił podczas szlifowania ogromnego pliku, ale żeby pokazać interesujące źródła danych i zmniejszyć liczbę zadań, które odpowiadają na ważne pytania. Pobierz obraz wirtualny Hadoop Zdecydowanie zaleca się użycie obrazu Cloudera do uruchomienia tych przykładów. Hadoop to technologia, która rozwiązuje problemy. Opakowanie obrazu Cloudera pozwala skupić się na pytaniach dotyczących dużych zbiorów danych. Ale jeśli zdecydujesz się na samodzielne złożenie wszystkich części, Hadoop stał się problemem, a nie rozwiązaniem. Pobierz obraz. Obraz CDH4, najnowsza oferta dostępna jest tutaj: obraz CDH4. Poprzednia wersja, CDH3, dostępna jest tutaj: obraz CDH3. Masz wybór technologii wirtualizacji. Możesz pobrać darmowe środowisko wirtualizacji z VMWare i innych. Na przykład przejdź do vmware i pobierz odtwarzacz vmware. Twój laptop prawdopodobnie działa w systemie Windows, więc możesz pobrać odtwarzacz vmware dla Windows. Przykłady w tym artykule będą dotyczyły VMWare dla tych przykładów i uruchamiania systemu Ubuntu Linux za pomocą tar zamiast winzip lub odpowiednika. Po pobraniu unarunzip wygląda następująco: tar - zxvf cloudera-demo-vm-cdh4.0.0-vmware. tar. gz. Lub, jeśli używasz CDH3, użyj: tar - zxvf cloudera-demo-vm-cdh3u4-vmware. tar. gz Unzip zwykle działa na plikach tar. Po rozpakowaniu możesz uruchomić obraz w następujący sposób: vmplayer cloudera-demo-vm. vmx. Będziesz miał teraz ekran, który wygląda tak, jak pokazano na Rysunku 3. Rysunek 3. Obraz wirtualny Cloudera Komenda vmplayer wchodzi prosto i uruchamia maszynę wirtualną. Jeśli używasz CDH3, musisz wyłączyć urządzenie i zmienić ustawienia pamięci. Użyj ikony przycisku zasilania obok zegara na środku dolnej części ekranu, aby wyłączyć maszynę wirtualną. Następnie masz dostęp do edycji ustawień maszyny wirtualnej. W przypadku CDH3 kolejnym krokiem jest przeładowanie obrazu wirtualnego większą ilością pamięci RAM. Większość ustawień można zmienić tylko przy wyłączonej maszynie wirtualnej. Rysunek 4 pokazuje, jak uzyskać dostęp do ustawień i zwiększyć pamięć RAM przeznaczoną na ponad 2 GB. Rysunek 4. Dodawanie pamięci RAM do maszyny wirtualnej Jak pokazano na Rysunku 5, można zmienić ustawienie sieci na mostkowane. Przy takim ustawieniu maszyna wirtualna otrzyma swój własny adres IP. Jeśli powoduje to problemy w sieci, możesz opcjonalnie korzystać z translacji adresów sieciowych (NAT). Będziesz używać sieci do łączenia się z bazą danych. Rysunek 5. Zmiana ustawień sieciowych na mostkowane Ogranicza cię pamięć RAM w systemie hosta, więc nie próbuj przydzielać większej ilości pamięci RAM niż ta, która istnieje na twoim komputerze. Jeśli to zrobisz, komputer będzie działał bardzo wolno. Teraz, na moment, na który czekałeś, włącz i uruchom maszynę wirtualną. Użytkownik cloudera jest automatycznie logowany przy starcie. Jeśli potrzebujesz, hasło Cloudera to: cloudera. Zainstaluj produkt Informix i bazę danych DB2. Będziesz potrzebować bazy danych do pracy. Jeśli nie masz już bazy danych, możesz pobrać edycję Developer Informix tutaj lub bezpłatną wersję DB2 Express-C Edition. Inną alternatywą do instalacji DB2 jest pobranie obrazu VMWare, który już ma zainstalowany program DB2 w systemie operacyjnym SuSE Linux. Zaloguj się jako root, używając hasła: hasło. Przejdź do identyfikatora użytkownika db2inst1. Praca jako root jest jak prowadzenie samochodu bez pasy bezpieczeństwa. Proszę porozmawiać z lokalną przyjazną administracją DBA o uruchomieniu bazy danych. Ten artykuł nie obejmuje tego tutaj. Nie próbuj instalować bazy danych wewnątrz obrazu wirtualnego Cloudera, ponieważ nie ma wystarczającej ilości wolnego miejsca na dysku. Maszyna wirtualna będzie łączyć się z bazą danych przy użyciu narzędzia Sqoop, które wymaga sterownika JDBC. Konieczne będzie posiadanie sterownika JDBC dla bazy danych w obrazie wirtualnym. Możesz zainstalować sterownik Informix tutaj. Sterownik JDBC Informix (pamiętaj, że tylko sterownik wewnątrz obrazu wirtualnego, a nie baza danych) jest instalowany jest pokazany na liście 1. Lista 1. Instalacja sterownika JDBC Informix Uwaga: Wybierz podkatalog w stosunku do homecloudera, aby nie wymagać uprawnień root dla instalacja. Sterownik JDBC DB2 jest spakowany w formacie zip, więc wystarczy rozpakować go w katalogu docelowym, jak pokazano na listingu 2. Lista 2. Instalacja sterownika JDBC DB2 Szybkie wprowadzenie do HDFS i MapReduce Przed rozpoczęciem przenoszenia danych między relacyjną bazą danych a Hadoop, potrzebujesz szybkiego wprowadzenia do HDFS i MapReduce. W Hadoopie jest wiele tutoriali na temat "cześć świat", więc przykłady tutaj mają dać tylko tyle podstaw dla ćwiczeń baz danych, żeby miały sens dla ciebie. HDFS zapewnia pamięć masową w węzłach w klastrze. Pierwszym krokiem przy użyciu Hadoop jest umieszczanie danych w HDFS. Kod pokazany na listingu 3 otrzymuje kopię książki Marka Twaina oraz książkę Jamesa Fenimora Coopera i kopiuje te teksty do HDFS. Listing 3. Załaduj Mark Twain i Jamesa Fenimore'a Cooper'a do HDFS Teraz masz dwa pliki w katalogu w HDFS. Proszę podać swoje podekscytowanie. Poważnie, w jednym węźle i tylko o 1 megabajt, jest to tak ekscytujące, jak obserwowanie suchej farby. Ale jeśli był to klaster o 400 węzłach i na żywo było 5 petabajtów, to naprawdę miałbyś problem z podnieceniem. Wiele tutoriali Hadoop wykorzystuje przykład licznika słów, który jest zawarty w przykładowym pliku jar. Okazuje się, że duża część analizy wymaga liczenia i agregowania. Przykład na listingu 4 pokazuje, jak wywołać licznik słów. Listing 4. Liczenie słów Twaina i Coopera. Sufiks. gz w DS. txt. gz mówi Hadoopowi, aby zajmował się dekompresją w ramach przetwarzania Map-Reduce. Cooper jest trochę gadatliwy, więc zasługuje na kompakcję. Istnieje dość strumień wiadomości z uruchamiania zadania liczenia słów. Hadoop z przyjemnością przedstawi wiele szczegółów na temat programów Mapping i Redukcji działających w Twoim imieniu. Krytyczne linie, które chcesz wyszukać, są pokazane na listingu 5, w tym druga lista nieudanego zadania i jak naprawić jeden z najczęstszych błędów, jakie napotkasz podczas uruchamiania MapReduce. Listing 5. Wiadomości MapReduce - szczęśliwa ścieżka Co oznaczają wszystkie wiadomości Hadoop wykonał wiele pracy i próbuje ci o tym opowiedzieć, w tym: Sprawdzono, czy plik wejściowy istnieje. Zaznaczone, aby sprawdzić, czy katalog wyjściowy istnieje, a jeśli tak, przerwać zadanie. Nie ma nic gorszego niż nadpisywanie godzin obliczeń za pomocą prostego błędu klawiatury. Rozpakuj plik JAR Javy do wszystkich węzłów odpowiedzialnych za wykonanie pracy. W tym przypadku jest to tylko jeden węzeł. Przeprowadzono fazę odwzorowania zadania. Zazwyczaj parsuje plik wejściowy i emituje parę kluczy. Zauważ, że klucz i wartość mogą być obiektami. Przeprowadzono fazę sortowania, która sortuje dane wyjściowe mapera na podstawie klucza. Przeprowadzono fazę redukującą, zazwyczaj podsumowuje strumień klucz-wartość i wypisuje wyjście do HDFS. Utworzono wiele wskaźników postępu. Rysunek 6 pokazuje przykładową stronę z danymi zleceń Hadoop po uruchomieniu ćwiczenia Hive. Rysunek 6. Przykładowa strona internetowa Hadoop Co zrobiła praca i gdzie jest wyjście Oba są dobrymi pytaniami i są pokazane na listingu 6. Listing 6. Map-Reduce output Jeśli zdarzy się, że dwukrotnie wykonasz tę samą pracę i zapomnisz usuń katalog wyjściowy, otrzymasz komunikaty o błędach pokazane na liście 7. Naprawienie tego błędu jest tak proste jak usunięcie katalogu. Listing 7. Komunikaty MapReduce - awaria z powodu wyjścia już istniejącego w HDFS Hadoop zawiera interfejs przeglądarki do sprawdzania statusu HDFS. Rysunek 7 pokazuje dane wyjściowe zadania zliczania słów. Rysunek 7. Eksplorowanie HDFS za pomocą przeglądarki Bardziej wyrafinowana konsola jest dostępna za darmo z witryny Cloudera. Zapewnia szereg możliwości wykraczających poza standardowe interfejsy sieciowe Hadoop. Zauważ, że stan zdrowia HDFS na Rysunku 8 jest pokazany jako Zły. Rysunek 8. Usługi Hadoop zarządzane przez Cloudera Manager Dlaczego jest źle Ponieważ na jednej wirtualnej maszynie HDFS nie może wykonać trzech kopii bloków danych. Gdy bloki są niepełnie replikowane, istnieje ryzyko utraty danych, więc stan systemu jest zły. Dobrze, że nie próbujesz uruchomić produkcji Hadoop w jednym węźle. Nie jesteś ograniczony do Javy dla swoich zadań MapReduce. Ten ostatni przykład MapReduce wykorzystuje Hadoop Streaming do obsługi mappera napisanego w Pythonie i reduktora używającego AWK. Nie, nie musisz być guru Java, aby pisać Map-Reduce Mark Twain nie był wielkim fanem Coopera. W tym przypadku użycia, Hadoop zapewni pewną prostą krytykę literacką porównując Twaina i Coopera. Test FleschKincaid oblicza poziom czytania określonego tekstu. Jednym z czynników w tej analizie jest średnia długość zdania. Parsowanie zdań okazuje się być bardziej skomplikowane niż poszukiwanie charakteru okresu. Pakiet openNLP i pakiet Python NLTK mają doskonałe parsery zdań. Dla uproszczenia, przykład pokazany na listingu 8 użyje długości słowa jako surogatu dla liczby sylab w słowie. Jeśli chcesz przenieść to na wyższy poziom, zaimplementuj test FleschKincaid w MapReduce, zindeksuj sieć i oblicz poziomy czytania ulubionych stron z wiadomościami. Listing 8. Kryteria literackie oparte na pythonach Wyjście mapera, dla słowa Twain, byłoby następujące: 5 0. Liczbowe długości słowa są sortowane w kolejności i przedstawiane do reduktora w porządku posortowanym. W przykładach pokazanych na listingu 9 i 10, sortowanie danych nie jest wymagane do uzyskania prawidłowego wyniku, ale sortowanie jest wbudowane w infrastrukturę MapReduce i tak się stanie. Listing 9. Reduktor AWK do krytyki literackiej Listing 10. Uruchamianie mapera Pythona i reduktora AWK z Hadoop Streaming Fani Marka Twaina mogą się zrelaksować, wiedząc, że Hadoop znajduje Coopera na dłuższe słowa i szokujące odchylenie standardowe (humor przeznaczony). To oczywiście zakłada, że ​​krótsze słowa są lepsze. Przejdźmy dalej, następnie zapisujemy dane w HDFS do Informix i DB2. Używanie Sqoop do zapisu danych z HDFS do Informix, DB2 lub MySQL za pośrednictwem JDBC Projekt Sqoop Apache jest opartym na JDBC opartym na JDBC narzędziem do przenoszenia danych Hadoop do bazy danych. Sqoop został pierwotnie stworzony w hakatonie w Cloudera, a następnie otwarty. Przenoszenie danych z HDFS do relacyjnej bazy danych jest częstym przypadkiem użycia. HDFS i Map-Reduce są świetne w robieniu ciężkiego podnoszenia. W przypadku prostych kwerend lub magazynu zaplecza dla witryny sieci Web buforowanie danych Map-Reduce w magazynie relacyjnym jest dobrym wzorcem projektowym. Możesz uniknąć ponownego uruchamiania mapy - Zmniejsz liczbę słów, po prostu Sqooping wyniki w Informix i DB2. Wygenerowałeś dane o Twain i Cooperze, teraz przenieś je do bazy danych, jak pokazano na listingu 11. Lista 11. Konfiguracja sterownika JDBC Przykłady pokazane w listach od 12 do 15 są przedstawione dla każdej bazy danych. Przejdź do interesującego nas przykładu, w tym do Informix, DB2 lub MySQL. Dla poliglotek baz danych, baw się dobrze, robiąc każdy przykład. Jeśli wybrana przez ciebie baza danych nie jest tutaj zawarta, nie będzie wielkim wyzwaniem, aby te próbki działały gdzie indziej. Listing 12. Użytkownicy Informix: Sqoop zapisujący wyniki liczby słów na liście Informix 13. Użytkownicy Informix: Sqoop zapisujący wyniki liczby słów na liście Informix 14. Użytkownicy DB2: Sqoop zapisujący wyniki liczby słów do listy DB2 15 Użytkownicy MySQL: Sqoop zapisuje wyniki liczenia słów do MySQL Importowanie danych do HDFS z Informix i DB2 z Sqoop Wstawianie danych do Hadoop HDFS można również wykonać za pomocą Sqoop. Funkcję dwukierunkową kontroluje się za pomocą parametru importu. Przykładowe bazy danych, które pochodzą z obu produktów, mają kilka prostych zestawów danych, które można wykorzystać do tego celu. Listing 16 pokazuje składnię i wyniki dla Sqooping każdego serwera. W przypadku użytkowników MySQL dostosuj składnię do następujących przykładów produktu Informix lub DB2. Listing 16. Import Sqoop z przykładowej bazy danych Informix do HDFS Dlaczego istnieją cztery różne pliki, z których każdy zawiera tylko część danych Sqoop jest wysoce zrównoleglonym narzędziem. Jeśli klaster z 4000 węzłów uruchamiający Sqoop wykona import z bazy danych przy pełnym otwarciu przepustnicy, 4000 połączeń będzie przypominało atak typu odmowa usługi na bazę danych. Domyślny limit połączeń Sqoops to cztery połączenia JDBC. Każde połączenie generuje plik danych w HDFS. Tak więc cztery pliki. Nie martw się, zobaczysz, jak Hadoop działa bez żadnych problemów. Następnym krokiem jest zaimportowanie tabeli DB2. Jak pokazano na listingu 17, poprzez określenie opcji - m 1 można zaimportować tabelę bez klucza podstawowego, a wynikiem jest pojedynczy plik. Listing 17. Import sqoop z przykładowej bazy danych DB2 do HDFS przy użyciu Hive: łączenie danych Informix i DB2 Istnieje interesujący przypadek użycia, aby połączyć dane z produktu Informix z DB2. Niezbyt ekscytujące z dwóch trywialnych tabel, ale ogromna wygrana dla wielu terabajtów lub petabajtów danych. Istnieją dwa podstawowe podejścia do łączenia różnych źródeł danych. Pozostawienie danych w stanie spoczynku i użycie technologii federacyjnej zamiast przenoszenia danych do pojedynczego sklepu w celu wykonania łączenia. Ekonomia i wydajność Hadoop sprawiają, że przenoszenie danych do HDFS i wykonywanie ciężkiego podnoszenia za pomocą MapReduce jest łatwym wyborem. Ograniczenia przepustowości sieci stanowią fundamentalną barierę, jeśli próbują połączyć dane w spoczynku z technologią w stylu federacyjnym. Hive dostarcza podzestaw SQL do działania w klastrze. Nie zapewnia semantyki transakcji. Nie jest zamiennikiem dla produktu Informix lub DB2. Jeśli masz jakieś ciężkie podnoszenie w postaci łączenia stolików, nawet jeśli masz kilka mniejszych stolików, ale musisz zrobić paskudne produkty kartezjańskie, Hadoop jest narzędziem z wyboru. Aby użyć języka zapytań Hive, wymagany jest podzbiór SQL nazwany metadanymi tabeli Hiveql. Możesz zdefiniować metadane względem istniejących plików w HDFS. Sqoop zapewnia wygodny skrót z opcją create-hive-table. Użytkownicy MySQL powinni swobodnie dostosowywać przykłady pokazane na listingu 18. Interesującym ćwiczeniem byłoby dołączenie do dużych arkuszy kalkulacyjnych MySQL lub innych tabel relacyjnych baz danych. Listing 18. Dołączanie tabeli informix. customer do tabeli db2.staff Jest znacznie ładniejsze, gdy używasz Hue do graficznego interfejsu przeglądarki, jak pokazano na rysunkach 9, 10 i 11. Rysunek 9. Odcień GUI wosku pszczelego dla gałęzi w CDH4 , zobacz zapytanie Hiveql Rys. 10. Odcień graficzny GUI wosku dla Hive, przeglądaj zapytanie Hiveql Rys. 11. Odświeżanie graficzne Honeql w kolorze graficznym, widok Wyniki sprzężenia Informix-DB2 Używanie Pig: Łączenie danych Informix i DB2 Pig jest językiem proceduralnym. Podobnie jak Hive, pod osłonami generuje kod MapReduce. Łatwość użytkowania Hadoop będzie się poprawiać wraz z pojawieniem się większej liczby projektów. Tak jak niektórzy z nas bardzo lubią linię poleceń, istnieje kilka graficznych interfejsów użytkownika, które działają bardzo dobrze z Hadoop. Listing 19 pokazuje kod Pig, który jest używany do łączenia tabeli klienta i tabeli staff z poprzedniego przykładu. Listing 19. Świnia, aby dołączyć tabelę Informix do tabeli DB2 Jak wybrać Java, Hive lub Pig Masz wiele opcji do programowania Hadoop, i najlepiej jest spojrzeć na przypadek użycia, aby wybrać odpowiednie narzędzie do pracy . Nie ograniczasz się do pracy nad relacyjnymi danymi, ale ten artykuł skupia się na dobrze współpracujących programach Informix, DB2 i Hadoop. Pisanie setek linii w języku Java w celu implementacji stylu relacyjnego hash-join to kompletna strata czasu, ponieważ algorytm Hadoop MapReduce jest już dostępny. Jak się wybierasz Jest to kwestia osobistych preferencji. Niektóre przypominają operacje zestawów kodowych w SQL. Niektórzy wolą kod proceduralny. Powinieneś wybrać język, który sprawi, że będziesz najbardziej produktywny. Jeśli masz wiele systemów relacyjnych i chcesz połączyć wszystkie dane z doskonałą wydajnością w niskiej cenie, Hadoop, MapReduce, Hive i Pig są gotowi ci pomóc. Nie usuwaj swoich danych: Przenoszenie partycji z systemu Informix do HDFS Większość nowoczesnych relacyjnych baz danych może dzielić dane. Typowym przypadkiem użycia jest podział na przedziały czasowe. Stałe okno danych jest przechowywane, na przykład w ciągu 18-miesięcznego okresu, po którym dane są archiwizowane. Możliwość odłączania partycji jest bardzo potężna. Ale po odłączeniu partycji, co robi się z danymi Archiwalne archiwum taśmowe starych danych jest bardzo kosztownym sposobem na pozbycie się starych bajtów. Po przejściu na mniej dostępne medium dane są bardzo rzadko dostępne, chyba że istnieje wymóg przeprowadzenia audytu prawnego. Hadoop zapewnia znacznie lepszą alternatywę. Przeniesienie archiwalnych bajtów ze starej partycji do Hadoop zapewnia wysoki dostęp do wydajności przy znacznie niższych kosztach niż przechowywanie danych w oryginalnym systemie transakcyjnym lub datamartdatawarehouse. Dane są zbyt stare, by mieć wartość transakcyjną, ale nadal są bardzo cenne dla organizacji do długoterminowej analizy. Pokazane wcześniej przykłady Sqoop dostarczają podstaw, jak przenieść te dane z partycji relacyjnej do HDFS. Bezpiecznik - Dostęp do plików HDFS za pośrednictwem NFS Dostęp do danych pliku InformixDB2flat w HDFS można uzyskać za pośrednictwem NFS, jak pokazano na listingu 20. Zapewnia to operacje linii poleceń bez użycia interfejsu hadoop fs - yadayada. Z perspektywy użycia technologii, NFS jest mocno ograniczone w środowisku Big Data, ale przykłady są uwzględnione dla programistów i niezbyt duże dane. Listing 20. Ustawienie bezpiecznika - dostęp do danych HDFS za pośrednictwem NFS Flume - utwórz gotowy do załadowania plik Flume następnej generacji lub flume-ng to szybki program ładujący równoległy. Bazy danych mają szybkie ładowarki, więc jak one dobrze się ze sobą współpracują Relacyjny przypadek użycia Flume-ng tworzy plik gotowy do załadowania, lokalnie lub zdalnie, tak aby serwer relacyjny mógł korzystać z jego szybkiego programu ładującego. Tak, ta funkcja nakłada się na Sqoop, ale skrypt pokazany na listingu 21 został utworzony na żądanie klienta specjalnie dla tego stylu ładowania bazy danych. Listing 21. Eksport danych HDFS do płaskiego pliku do załadowania przez bazę danych Oozie - dodawanie przepływu pracy dla wielu zadań Oozie będzie łączyć ze sobą wiele zadań Hadoop. Jest ładny zestaw przykładów zawartych w oozie, które są używane w zestawie kodów pokazanym na listingu 22. Lista 22. Kontrola zadań za pomocą oozie HBase, wysokowydajny magazyn kluczy i wartości kluczowych HBase to wysokowydajny magazyn kluczy i wartości. Jeśli Twój przypadek użycia wymaga skalowalności i wymaga tylko bazy danych równoważnej transakcjom automatycznym, HBase może być technologią do jazdy. HBase nie jest bazą danych. Nazwa jest niefortunna, ponieważ dla niektórych termin baza oznacza bazę danych. Wykonuje doskonałą robotę w wysoko wydajnych sklepach z kluczowymi wartościami. Występuje pewne pokrywanie się funkcji HBase, Informix, DB2 i innych relacyjnych baz danych. W przypadku transakcji ACID, pełnej zgodności SQL i wielu indeksów tradycyjna relacyjna baza danych jest oczywistym wyborem. To ostatnie ćwiczenie kodu jest podstawową znajomością HBASE. Jest prosty w konstrukcji i w żaden sposób nie przedstawia zakresu funkcjonalności HBases. Proszę użyć tego przykładu, aby zrozumieć niektóre podstawowe funkcje HBase. HBase, The Definitive Guide, autorstwa Larsa George'a, jest obowiązkową lekturą, jeśli planujesz wdrożyć lub odrzucić HBase dla konkretnego przypadku użycia. Ten ostatni przykład, pokazany na listingu 23 i 24, używa interfejsu REST dostarczonego z HBase do wstawiania par klucz-wartość do tabeli HBase. Szelki testowe są oparte na zwijaniu. Listing 23. Stwórz tabelę HBase i wstaw wiersz 24. Lista interfejsów REST HBase Wnioski Wow, dotarłeś do końca, dobra robota To dopiero początek zrozumienia Hadoop i jego interakcji z Informix i DB2. Oto kilka sugestii dotyczących kolejnych kroków. Weź przykłady pokazane wcześniej i dostosuj je do swoich serwerów. Będziesz chciał użyć małych danych, ponieważ w wirtualnym obrazie nie ma zbyt wiele miejsca. Zdobądź certyfikat jako administrator Hadoop. Odwiedź witrynę Cloudera, aby uzyskać informacje na temat kursów i informacji o testach. Zdobądź certyfikat jako programista Hadoop. Uruchom klaster za pomocą bezpłatnej wersji Cloudera Manager. Zacznij korzystać z IBM Big Sheets na CDH4. Zasoby do pobrania Powiązane tematy Wyzwalacze MySQL: Automatyczne generowanie dodatkowych informacji w bazie danych Wyzwalacze MySQL to jedna z nowszych funkcji w MySQL, które pomagają uczynić ją realną alternatywą dla dużych aplikacji dla przedsiębiorstw. Nie tak dawno temu, ci, którzy robili swoje rzeczy korzystając z dużych komercyjnie baz danych, takich jak Oracle i DB2, zauważyli, że MySQL był dobrą, szybką małą bazą danych, ale brakowało jej ważnych funkcji, takich jak procedury przechowywane, transakcje i wyzwalacze. Począwszy od wersji 5.0 MySQL, funkcje te można wykreślić z tej listy. Czym są wyzwalacze MySQL i dlaczego zdolność MySQL do ich używania czyni je bardziej atrakcyjnym dla poważnych użytkowników baz danych? Po prostu, wyzwalacze są małymi programami, które są przechowywane w samej bazie danych i są aktywowane przez zdarzenia bazy danych, które często pochodzą z aplikacji warstwa. Te strącające zdarzenia bazy danych to kwerendy UPDATE, DELETE lub INSERT. Sam wyzwalacz może zostać wykonany przed lub po zapytaniu, które go inicjuje. Wyzwalacze są często używane do utrzymywania integralności danych w tabelach aplikacji. Gdy na przykład użytkownik witryny dokona zakupu, pierwszą operacją, która ma miejsce w bazie danych, może być dodanie kredytu do tabeli rozliczania. W wyniku wyzwalacza to działanie może zainicjować reakcję łańcuchową zdarzeń w innych tabelach w całej aplikacji. Liczba produktów może zostać zmniejszona w tabeli zasobów, obciążenia odjętego z salda konta klienta w innej tabeli, kredytu sklepu zastosowanego do kolejnej tabeli. Możesz powiedzieć, że robiłeś to cały czas w swoich aplikacjach używając PHP lub Perla lub Pythona lub kodu ASP. Co jest ważnego w używaniu wyzwalaczy MySQL? Cóż, istnieją pewne zalety używania wyzwalaczy ponad kodem aplikacji do utrzymywania integralności danych w tabelach. Wyzwalacz zazwyczaj wykonuje typy zadań opisanych szybciej niż kod aplikacji i może być aktywowany łatwo i szybko za kulisami i nie musi być częścią kodu aplikacji. Oszczędza to czas i pozwala uniknąć nadmiarowego kodowania. Jeśli kiedykolwiek przeniesiesz aplikację na inny język, prawdopodobnie Twoje wyzwalacze pozostaną w miejscu bez modyfikacji, wraz z tabelami i innymi obiektami bazy danych. Aby pokazać, jak działają wyzwalacze MySQL, skonfiguruj dwie proste tabele w bazie danych, wywołując 8220salesrecords8221, które mają współzależne dane. Wyobraź sobie bazę danych, która śledzi zapisy sprzedaży trzech sprzedawców w domu towarowym. Pracują w dziale elektroniki sprzedając takie rzeczy jak telewizory. odtwarzacze stereo i odtwarzacze MP3. Mamy główny stół, który rejestruje każdą dokonaną sprzedaż. Zapisuje kwotę sprzedaży (saleamt), datę (datę), nazwisko sprzedawcy (imię i nazwisko), jego numer identyfikacyjny (employeeid) i identyfikator produktu (prodid). Dobrze zadzwoń do tej tabeli (zręcznie) 8220sales8221. W drugiej tabeli chcemy zachować pewne dane, które pozwolą nam z łatwością śledzić, jak działa każdy sprzedawca. Obejmuje to identyfikator sprzedawcy (employeeid), nazwisko (nazwę), całkowitą liczbę sprzedaży (sumy sprzedaży) i kolumnę, która utrzymuje średnią sprzedaż każdego sprzedawcy (avesale). Chcemy zobaczyć, kto przenosi produkty z wyższej półki. Dobrze zadzwoń do tej tabeli 8220performance8221. Teraz jest trudna część. Jak już wspomniałem, wyzwalacze są obiektami bazy danych tak jak są to tabele. Wyzwalacze są jednak w stanie wykonać kod proceduralny, który modyfikuje dane w twoich tabelach. W tym przypadku chcemy, aby nasz wyzwalacz wystrzelił przed każdą instrukcją INSERT, która wykonuje się w tabeli sprzedaży. Gdy rekord sprzedaży zostanie wstawiony do tabeli sprzedaży, sumy sprzedawców muszą zostać zaktualizowane w tabeli wyników. Poniższy kod można wpisać w swoim ulubionym edytorze tekstowym i wkleić do konsoli w podpowiedzi MySQL. Zanim to jednak zrobisz, chcesz wykonać tę linię: nasz kod proceduralny używa średników na końcu instrukcji, więc musimy ustawić inny ogranicznik, aby MySQL wiedział, kiedy nasz blok kodu się skończył, i aby nie przerwał przetwarzania nasz blok, gdy trafi średnik. Pamiętaj, że po zakończeniu bloku będziesz musiał ustawić ogranicznik z powrotem na średnik lub zakończyć wszelkie kolejne polecenia z nowym ogranicznikiem. Na przykład, jeśli zrobiłeś błędy w bloku CREATE TRIGGER i chcesz go usunąć, DROP TRIGGER nie będzie działał, dopóki nie ustawisz ogranicznika z powrotem na średnik. Oto kod wyzwalacza: OK, porozmawiajmy o kodzie. Używając instrukcji CREATE TRIGGER, uruchomiliśmy wyzwalacz, nazywając go salesbitrg. Wyzwalacze MySQL można uruchamiać przed lub po zdarzeniu INSERT, UPDATE lub DELETE. Ta wystrzeliwuje, zanim jakiekolwiek dane zostaną wstawione do tabeli sprzedaży. Klauzula FOR EACH ROW oznacza, że ​​blok będzie działał w każdym wierszu, który spełnia kryteria naszych instrukcji SQL. Słowa kluczowe BEGIN i END zawierają instrukcje spustowe, które będą wykonywane po uruchomieniu wyzwalacza. Deklarowane są dwie zmienne. Pierwszym z nich jest numer, który sprawdza, czy pracownik, który dokonał sprzedaży, która ma zostać wprowadzona, ma wcześniejszą sprzedaż wprowadzoną do tabeli wyników. Jeśli nie ma pasujących pracowników, to jest to pierwsza sprzedaż pracowników, a to spełnia warunek ELSE naszego oświadczenia 8220IF. Dane te zostaną wprowadzone jako wstawka do tabeli wydajności, a nie do aktualizacji. Jeśli numer jest większy od 0, tabela wydajności zostanie zaktualizowana. Druga zmienna, totrows, to liczba sprzedaży jaką pracownik ma w tabeli sprzedaży. Ta wartość służy do obliczenia średniej sprzedaży pracowników. Liczba jest wykonywana, zanim sprzedaż zostanie wstawiona do tabeli sprzedaży, więc musimy do niej dodać. Gdy tabela wyników jest aktualizowana, średnie sumy sprzedaży (totrows1). Jeśli nasz czynnik uruchamiający MySQL działa poprawnie, tabela wydajności będzie zawierać bieżącą sumę wszystkich sprzedaży sprzedawców, a także średnią ich całkowitą sprzedaż. Będzie to robić niezależnie od kodu aplikacji i będzie przenośne na dowolnej platformie aplikacji. Aby zawirować, wstaw niektóre dane do tabeli sprzedaży i monitoruj zawartość tabeli wydajności. Oto stwierdzenie: Zmień liczby i nazwy i spróbuj kilka razy. (Pamiętaj, że pracownik zachowuje ten sam numer pracownika dla każdej swojej sprzedaży.) Jeśli czujesz się żądny przygód, zacznij myśleć o tym, jak wyzwalacz MySQL będzie musiał zostać rozszerzony, aby uwzględniać instrukcje UPDATE i DELETE w tabeli sprzedaży. Darmowy eBook Zapisz się do mojego newslettera i otrzymaj ebook na temat zasad modelowania relacji z istotami jako darmowy prezent: co mówią goście. Po prostu natknąłem się na twoją stronę, szukając pewnej teorii normalizacji i muszę powiedzieć, że jest fantastyczna. Byłem w bazie danych przez 10 lat i nigdy nie natknąłem się na taką przydatną stronę. Dziękujemy za poświęcenie czasu na stworzenie tej witryny.

No comments:

Post a Comment