Hive - szybki przewodnik
Termin „duże zbiory danych” jest używany w odniesieniu do zbiorów dużych zbiorów danych, które obejmują ogromną ilość, dużą prędkość i różnorodność danych, których liczba rośnie z dnia na dzień. Przy użyciu tradycyjnych systemów zarządzania danymi trudno jest przetwarzać Big Data. Dlatego Apache Software Foundation wprowadziła platformę o nazwie Hadoop, aby rozwiązać problemy związane z zarządzaniem i przetwarzaniem Big Data.
Hadoop
Hadoop to platforma typu open source do przechowywania i przetwarzania Big Data w środowisku rozproszonym. Zawiera dwa moduły, jeden to MapReduce, a drugi to Hadoop Distributed File System (HDFS).
MapReduce: Jest to równoległy model programowania służący do przetwarzania dużych ilości ustrukturyzowanych, częściowo ustrukturyzowanych i nieustrukturyzowanych danych na dużych klastrach towarowego sprzętu.
HDFS:Hadoop Distributed File System jest częścią struktury Hadoop, używanej do przechowywania i przetwarzania zestawów danych. Zapewnia odporny na błędy system plików do uruchamiania na standardowym sprzęcie.
Ekosystem Hadoop zawiera różne podprojekty (narzędzia), takie jak Sqoop, Pig i Hive, które są używane do pomocy modułom Hadoop.
Sqoop: Służy do importowania i eksportowania danych tam iz powrotem między HDFS i RDBMS.
Pig: Jest to proceduralna platforma językowa służąca do tworzenia skryptu dla operacji MapReduce.
Hive: Jest to platforma służąca do tworzenia skryptów typu SQL do wykonywania operacji MapReduce.
Note: Istnieją różne sposoby wykonywania operacji MapReduce:
- Tradycyjne podejście z wykorzystaniem programu Java MapReduce do danych ustrukturyzowanych, częściowo ustrukturyzowanych i nieustrukturyzowanych.
- Podejście skryptowe dla MapReduce do przetwarzania ustrukturyzowanych i częściowo ustrukturyzowanych danych przy użyciu Pig.
- Hive Query Language (HiveQL lub HQL) dla MapReduce do przetwarzania danych strukturalnych przy użyciu Hive.
Co to jest Hive
Hive to narzędzie infrastruktury hurtowni danych do przetwarzania ustrukturyzowanych danych na platformie Hadoop. Znajduje się na szczycie Hadoop, aby podsumować Big Data i ułatwia wykonywanie zapytań i analizowanie.
Początkowo Hive został opracowany przez Facebooka, później przejęła go Apache Software Foundation i dalej rozwijała jako open source pod nazwą Apache Hive. Jest używany przez różne firmy. Na przykład Amazon używa go w Amazon Elastic MapReduce.
Hive nie jest
- Relacyjna baza danych
- Projekt dla przetwarzania transakcji online (OLTP)
- Język do zapytań w czasie rzeczywistym i aktualizacji na poziomie wiersza
Funkcje ula
- Przechowuje schemat w bazie danych i przetwarza dane w HDFS.
- Jest przeznaczony dla OLAP.
- Udostępnia język typu SQL do wykonywania zapytań o nazwie HiveQL lub HQL.
- Jest znany, szybki, skalowalny i rozszerzalny.
Architektura ula
Poniższy diagram składników przedstawia architekturę Hive:
Ten schemat komponentów zawiera różne jednostki. W poniższej tabeli opisano każdą jednostkę:
Nazwa jednostki | Operacja |
---|---|
Interfejs użytkownika | Hive to oprogramowanie infrastruktury hurtowni danych, które może tworzyć interakcje między użytkownikiem a systemem plików HDFS. Interfejsy użytkownika obsługiwane przez Hive to Hive Web UI, Hive Command Line i Hive HD Insight (na serwerze Windows). |
Meta Store | Hive wybiera odpowiednie serwery baz danych do przechowywania schematu lub metadanych tabel, baz danych, kolumn w tabeli, ich typów danych i mapowania HDFS. |
Silnik procesów HiveQL | HiveQL jest podobny do SQL do wykonywania zapytań dotyczących informacji o schemacie w Metastore. Jest to jeden z zamienników tradycyjnego podejścia do programu MapReduce. Zamiast pisać program MapReduce w Javie, możemy napisać zapytanie o zadanie MapReduce i przetworzyć je. |
Silnik wykonawczy | Częścią będącą połączeniem mechanizmu HiveQL Process Engine i MapReduce jest Hive Execution Engine. Silnik wykonawczy przetwarza zapytanie i generuje wyniki takie same, jak wyniki MapReduce. Wykorzystuje smak MapReduce. |
HDFS lub HBASE | Rozproszony system plików Hadoop lub HBASE to techniki przechowywania danych służące do przechowywania danych w systemie plików. |
Działanie ula
Poniższy diagram przedstawia przepływ pracy między Hive i Hadoop.
W poniższej tabeli zdefiniowano, jak Hive współdziała z platformą Hadoop:
Krok nr | Operacja |
---|---|
1 | Execute Query Interfejs Hive, taki jak wiersz poleceń lub interfejs użytkownika sieci Web, wysyła zapytanie do sterownika (dowolnego sterownika bazy danych, takiego jak JDBC, ODBC itp.) W celu wykonania. |
2 | Get Plan Sterownik korzysta z pomocy kompilatora zapytań, który analizuje zapytanie w celu sprawdzenia składni i planu zapytania lub wymagań zapytania. |
3 | Get Metadata Kompilator wysyła żądanie metadanych do Metastore (dowolnej bazy danych). |
4 | Send Metadata Metastore wysyła metadane jako odpowiedź do kompilatora. |
5 | Send Plan Kompilator sprawdza wymagania i ponownie przesyła plan do sterownika. Do tej pory analizowanie i kompilowanie zapytania zostało zakończone. |
6 | Execute Plan Kierowca przesyła plan wykonania do silnika wykonawczego. |
7 | Execute Job Wewnętrznie proces wykonania zadania jest zadaniem MapReduce. Silnik wykonawczy wysyła zadanie do JobTracker, który znajduje się w węźle Nazwa i przypisuje to zadanie do TaskTracker, który znajduje się w węźle danych. Tutaj zapytanie wykonuje zadanie MapReduce. |
7.1 | Metadata Ops W międzyczasie silnik wykonawczy może wykonywać operacje na metadanych za pomocą Metastore. |
8 | Fetch Result Silnik wykonawczy otrzymuje wyniki z węzłów danych. |
9 | Send Results Silnik wykonawczy wysyła te wynikowe wartości do sterownika. |
10 | Send Results Sterownik wysyła wyniki do interfejsów Hive. |
Wszystkie podprojekty Hadoop, takie jak Hive, Pig i HBase, obsługują system operacyjny Linux. Dlatego musisz zainstalować dowolny system operacyjny o smaku Linux. Podczas instalacji programu Hive wykonywane są następujące proste kroki:
Krok 1: Weryfikacja instalacji JAVA
Java musi być zainstalowana w systemie przed zainstalowaniem Hive. Zweryfikujmy instalację Java za pomocą następującego polecenia:
$ java –version
Jeśli Java jest już zainstalowana w twoim systemie, zobaczysz następującą odpowiedź:
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b13)
Java HotSpot(TM) Client VM (build 25.0-b02, mixed mode)
Jeśli java nie jest zainstalowana w twoim systemie, wykonaj poniższe kroki, aby zainstalować java.
Instalowanie Java
I krok:
Pobierz java (JDK <najnowsza wersja> - X64.tar.gz), odwiedzając poniższe łącze http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html.
Następnie jdk-7u71-linux-x64.tar.gz zostanie pobrany do twojego systemu.
Etap II:
Pobrany plik java znajdziesz zwykle w folderze Pobrane. Sprawdź go i wyodrębnij plik jdk-7u71-linux-x64.gz, używając następujących poleceń.
$ cd Downloads/
$ ls jdk-7u71-linux-x64.gz $ tar zxf jdk-7u71-linux-x64.gz
$ ls
jdk1.7.0_71 jdk-7u71-linux-x64.gz
Krok III:
Aby udostępnić Javę wszystkim użytkownikom, musisz przenieść ją do lokalizacji „/ usr / local /”. Otwórz root i wpisz następujące polecenia.
$ su
password:
# mv jdk1.7.0_71 /usr/local/
# exit
Krok IV:
Aby ustawić zmienne PATH i JAVA_HOME, dodaj następujące polecenia do pliku ~ / .bashrc.
export JAVA_HOME=/usr/local/jdk1.7.0_71
export PATH=PATH:$JAVA_HOME/bin
Teraz sprawdź instalację, używając polecenia java -version z terminala, jak wyjaśniono powyżej.
Krok 2: weryfikacja instalacji Hadoop
Hadoop musi być zainstalowany w systemie przed zainstalowaniem Hive. Zweryfikujmy instalację Hadoop za pomocą następującego polecenia:
$ hadoop version
Jeśli Hadoop jest już zainstalowany w twoim systemie, otrzymasz następującą odpowiedź:
Hadoop 2.4.1 Subversion https://svn.apache.org/repos/asf/hadoop/common -r 1529768
Compiled by hortonmu on 2013-10-07T06:28Z
Compiled with protoc 2.5.0
From source with checksum 79e53ce7994d1628b240f09af91e1af4
Jeśli Hadoop nie jest zainstalowany w Twoim systemie, wykonaj następujące czynności:
Pobieranie Hadoop
Pobierz i wyodrębnij Hadoop 2.4.1 z Apache Software Foundation, używając następujących poleceń.
$ su
password:
# cd /usr/local
# wget http://apache.claz.org/hadoop/common/hadoop-2.4.1/
hadoop-2.4.1.tar.gz
# tar xzf hadoop-2.4.1.tar.gz
# mv hadoop-2.4.1/* to hadoop/
# exit
Instalowanie Hadoop w trybie pseudo rozproszonym
Poniższe kroki służą do instalowania Hadoop 2.4.1 w trybie pseudo rozproszonym.
Krok I: Konfigurowanie Hadoop
Możesz ustawić zmienne środowiskowe Hadoop, dołączając następujące polecenia do ~/.bashrc plik.
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export
PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
Teraz zastosuj wszystkie zmiany w aktualnie działającym systemie.
$ source ~/.bashrc
Krok II: Konfiguracja Hadoop
Wszystkie pliki konfiguracyjne Hadoop można znaleźć w lokalizacji „$ HADOOP_HOME / etc / hadoop”. Musisz wprowadzić odpowiednie zmiany w tych plikach konfiguracyjnych zgodnie z infrastrukturą Hadoop.
$ cd $HADOOP_HOME/etc/hadoop
Aby tworzyć programy Hadoop przy użyciu języka Java, musisz zresetować zmienne środowiskowe Java w programie hadoop-env.sh plik, zastępując JAVA_HOME wartość z lokalizacją Java w systemie.
export JAVA_HOME=/usr/local/jdk1.7.0_71
Poniżej znajduje się lista plików, które należy edytować, aby skonfigurować Hadoop.
core-site.xml
Plik core-site.xml plik zawiera informacje, takie jak numer portu używany dla wystąpienia Hadoop, pamięć przydzielona dla systemu plików, limit pamięci do przechowywania danych i rozmiar buforów do odczytu / zapisu.
Otwórz plik core-site.xml i dodaj następujące właściwości między tagami <configuration> i </configuration>.
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
hdfs-site.xml
Plik hdfs-site.xmlplik zawiera informacje, takie jak wartość danych replikacji, ścieżka do kodu nazwy i ścieżka do węzła danych lokalnych systemów plików. Oznacza to miejsce, w którym chcesz przechowywać Hadoop infra.
Załóżmy następujące dane.
dfs.replication (data replication value) = 1
(In the following path /hadoop/ is the user name.
hadoopinfra/hdfs/namenode is the directory created by hdfs file system.)
namenode path = //home/hadoop/hadoopinfra/hdfs/namenode
(hadoopinfra/hdfs/datanode is the directory created by hdfs file system.)
datanode path = //home/hadoop/hadoopinfra/hdfs/datanode
Otwórz ten plik i dodaj następujące właściwości między tagami <configuration>, </configuration> w tym pliku.
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>file:///home/hadoop/hadoopinfra/hdfs/namenode </value>
</property>
<property>
<name>dfs.data.dir</name>
<value>file:///home/hadoop/hadoopinfra/hdfs/datanode </value >
</property>
</configuration>
Note: W powyższym pliku wszystkie wartości właściwości są zdefiniowane przez użytkownika i można wprowadzać zmiany zgodnie z infrastrukturą Hadoop.
yarn-site.xml
Ten plik służy do konfigurowania przędzy w Hadoop. Otwórz plik yarn-site.xml i dodaj następujące właściwości między tagami <configuration>, </configuration> w tym pliku.
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
mapred-site.xml
Ten plik jest używany do określenia, której platformy MapReduce używamy. Domyślnie Hadoop zawiera szablon yarn-site.xml. Przede wszystkim musisz skopiować plik z mapred-site, xml.template do pliku mapred-site.xml za pomocą następującego polecenia.
$ cp mapred-site.xml.template mapred-site.xml
otwarty mapred-site.xml file i dodaj następujące właściwości między tagami <configuration>, </configuration> w tym pliku.
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
Weryfikacja instalacji Hadoop
Poniższe kroki służą do weryfikacji instalacji Hadoop.
Krok I: Konfiguracja nazwy węzła
Skonfiguruj namenode za pomocą polecenia „hdfs namenode -format” w następujący sposób.
$ cd ~ $ hdfs namenode -format
Oczekiwany wynik jest następujący.
10/24/14 21:30:55 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = localhost/192.168.1.11
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 2.4.1
...
...
10/24/14 21:30:56 INFO common.Storage: Storage directory
/home/hadoop/hadoopinfra/hdfs/namenode has been successfully formatted.
10/24/14 21:30:56 INFO namenode.NNStorageRetentionManager: Going to
retain 1 images with txid >= 0
10/24/14 21:30:56 INFO util.ExitUtil: Exiting with status 0
10/24/14 21:30:56 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at localhost/192.168.1.11
************************************************************/
Krok II: weryfikacja plików dfs na platformie Hadoop
Następujące polecenie służy do uruchamiania dfs. Wykonanie tego polecenia spowoduje uruchomienie systemu plików Hadoop.
$ start-dfs.sh
Oczekiwany wynik jest następujący:
10/24/14 21:37:56
Starting namenodes on [localhost]
localhost: starting namenode, logging to /home/hadoop/hadoop-2.4.1/logs/hadoop-hadoop-namenode-localhost.out
localhost: starting datanode, logging to /home/hadoop/hadoop-2.4.1/logs/hadoop-hadoop-datanode-localhost.out
Starting secondary namenodes [0.0.0.0]
Krok III: weryfikacja skryptu przędzy
Następujące polecenie służy do uruchamiania skryptu przędzy. Wykonanie tego polecenia spowoduje uruchomienie demonów przędzy.
$ start-yarn.sh
Oczekiwany wynik jest następujący:
starting yarn daemons
starting resourcemanager, logging to /home/hadoop/hadoop-2.4.1/logs/yarn-hadoop-resourcemanager-localhost.out
localhost: starting nodemanager, logging to /home/hadoop/hadoop-2.4.1/logs/yarn-hadoop-nodemanager-localhost.out
Krok IV: Dostęp do Hadoop w przeglądarce
Domyślny numer portu dostępu do Hadoop to 50070. Użyj następującego adresu URL, aby pobrać usługi Hadoop w przeglądarce.
http://localhost:50070/
Krok V: Sprawdź wszystkie aplikacje dla klastra
Domyślny numer portu dostępu do wszystkich aplikacji klastra to 8088. Aby odwiedzić tę usługę, użyj następującego adresu URL.
http://localhost:8088/
Krok 3: Pobieranie Hive
W tym samouczku używamy hive-0.14.0. Możesz go pobrać, odwiedzając poniższy linkhttp://apache.petsads.us/hive/hive-0.14.0/.Załóżmy, że zostanie pobrany do katalogu / Downloads. Tutaj pobieramy archiwum Hive o nazwie „apache-hive-0.14.0-bin.tar.gz” na potrzeby tego samouczka. Poniższe polecenie służy do weryfikacji pobierania:
$ cd Downloads $ ls
Po pomyślnym pobraniu zobaczysz następującą odpowiedź:
apache-hive-0.14.0-bin.tar.gz
Krok 4: Instalowanie gałęzi
Poniższe kroki są wymagane do zainstalowania Hive w systemie. Załóżmy, że archiwum Hive jest pobierane do katalogu / Downloads.
Wyodrębnianie i weryfikowanie archiwum Hive
Następujące polecenie służy do weryfikacji pobierania i wyodrębniania archiwum gałęzi:
$ tar zxvf apache-hive-0.14.0-bin.tar.gz $ ls
Po pomyślnym pobraniu zobaczysz następującą odpowiedź:
apache-hive-0.14.0-bin apache-hive-0.14.0-bin.tar.gz
Kopiowanie plików do katalogu / usr / local / hive
Musimy skopiować pliki od superużytkownika „su -”. Poniższe polecenia służą do kopiowania plików z wyodrębnionego katalogu do katalogu / usr / local / hive ”.
$ su -
passwd:
# cd /home/user/Download
# mv apache-hive-0.14.0-bin /usr/local/hive
# exit
Konfigurowanie środowiska dla Hive
Możesz skonfigurować środowisko Hive, dołączając następujące wiersze do ~/.bashrc plik:
export HIVE_HOME=/usr/local/hive
export PATH=$PATH:$HIVE_HOME/bin export CLASSPATH=$CLASSPATH:/usr/local/Hadoop/lib/*:.
export CLASSPATH=$CLASSPATH:/usr/local/hive/lib/*:.
Następujące polecenie służy do wykonania pliku ~ / .bashrc.
$ source ~/.bashrc
Krok 5: Konfigurowanie gałęzi
Aby skonfigurować Hive z Hadoop, musisz edytować plik hive-env.sh plik, który jest umieszczony w $HIVE_HOME/confinformator. Następujące polecenia przekierowują do Hiveconfig folder i skopiuj plik szablonu:
$ cd $HIVE_HOME/conf $ cp hive-env.sh.template hive-env.sh
Edytuj plik hive-env.sh plik, dołączając następujący wiersz:
export HADOOP_HOME=/usr/local/hadoop
Instalacja ula została zakończona pomyślnie. Teraz do skonfigurowania Metastore potrzebny jest zewnętrzny serwer bazy danych. Korzystamy z bazy danych Apache Derby.
Krok 6: Pobieranie i instalowanie Apache Derby
Wykonaj poniższe czynności, aby pobrać i zainstalować Apache Derby:
Pobieranie Apache Derby
Następujące polecenie służy do pobierania Apache Derby. Pobieranie zajmuje trochę czasu.
$ cd ~ $ wget http://archive.apache.org/dist/db/derby/db-derby-10.4.2.0/db-derby-10.4.2.0-bin.tar.gz
Poniższe polecenie służy do weryfikacji pobierania:
$ ls
Po pomyślnym pobraniu zobaczysz następującą odpowiedź:
db-derby-10.4.2.0-bin.tar.gz
Wyodrębnianie i weryfikacja archiwum Derby
Następujące polecenia służą do wyodrębniania i weryfikacji archiwum Derby:
$ tar zxvf db-derby-10.4.2.0-bin.tar.gz
$ ls
Po pomyślnym pobraniu zobaczysz następującą odpowiedź:
db-derby-10.4.2.0-bin db-derby-10.4.2.0-bin.tar.gz
Kopiowanie plików do katalogu / usr / local / derby
Musimy skopiować od superużytkownika „su -”. Poniższe polecenia służą do kopiowania plików z wyodrębnionego katalogu do katalogu / usr / local / derby:
$ su -
passwd:
# cd /home/user
# mv db-derby-10.4.2.0-bin /usr/local/derby
# exit
Konfigurowanie środowiska dla Derby
Środowisko Derby można skonfigurować, dołączając następujące wiersze do ~/.bashrc plik:
export DERBY_HOME=/usr/local/derby
export PATH=$PATH:$DERBY_HOME/bin
Apache Hive
18
export CLASSPATH=$CLASSPATH:$DERBY_HOME/lib/derby.jar:$DERBY_HOME/lib/derbytools.jar
Następujące polecenie służy do wykonania ~/.bashrc plik:
$ source ~/.bashrc
Utwórz katalog do przechowywania Metastore
Utwórz katalog o nazwie data w katalogu $ DERBY_HOME do przechowywania danych Metastore.
$ mkdir $DERBY_HOME/data
Instalacja Derby i konfiguracja środowiska zostały zakończone.
Krok 7: Konfigurowanie Metastore of Hive
Skonfigurowanie Metastore oznacza określenie w Hive, gdzie jest przechowywana baza danych. Możesz to zrobić, edytując plik hive-site.xml, który znajduje się w katalogu $ HIVE_HOME / conf. Przede wszystkim skopiuj plik szablonu za pomocą następującego polecenia:
$ cd $HIVE_HOME/conf
$ cp hive-default.xml.template hive-site.xml
Edytować hive-site.xml i dołącz następujące wiersze między tagami <configuration> i </configuration>:
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby://localhost:1527/metastore_db;create=true </value>
<description>JDBC connect string for a JDBC metastore </description>
</property>
Utwórz plik o nazwie jpox.properties i dodaj do niego następujące wiersze:
javax.jdo.PersistenceManagerFactoryClass =
org.jpox.PersistenceManagerFactoryImpl
org.jpox.autoCreateSchema = false
org.jpox.validateTables = false
org.jpox.validateColumns = false
org.jpox.validateConstraints = false
org.jpox.storeManagerType = rdbms
org.jpox.autoCreateSchema = true
org.jpox.autoStartMechanismMode = checked
org.jpox.transactionIsolation = read_committed
javax.jdo.option.DetachAllOnCommit = true
javax.jdo.option.NontransactionalRead = true
javax.jdo.option.ConnectionDriverName = org.apache.derby.jdbc.ClientDriver
javax.jdo.option.ConnectionURL = jdbc:derby://hadoop1:1527/metastore_db;create = true
javax.jdo.option.ConnectionUserName = APP
javax.jdo.option.ConnectionPassword = mine
Krok 8: weryfikacja instalacji gałęzi
Przed uruchomieniem Hive musisz utworzyć plik /tmpfolder i oddzielny folder Hive w HDFS. Tutaj używamy/user/hive/warehouseteczka. Musisz ustawić uprawnienia do zapisu dla tych nowo utworzonych folderów, jak pokazano poniżej:
chmod g+w
Teraz ustaw je w HDFS przed zweryfikowaniem Hive. Użyj następujących poleceń:
$ $HADOOP_HOME/bin/hadoop fs -mkdir /tmp $ $HADOOP_HOME/bin/hadoop fs -mkdir /user/hive/warehouse $ $HADOOP_HOME/bin/hadoop fs -chmod g+w /tmp $ $HADOOP_HOME/bin/hadoop fs -chmod g+w /user/hive/warehouse
Następujące polecenia służą do weryfikacji instalacji programu Hive:
$ cd $HIVE_HOME $ bin/hive
Po pomyślnej instalacji Hive zobaczysz następującą odpowiedź:
Logging initialized using configuration in jar:file:/home/hadoop/hive-0.9.0/lib/hive-common-0.9.0.jar!/hive-log4j.properties
Hive history file=/tmp/hadoop/hive_job_log_hadoop_201312121621_1494929084.txt
………………….
hive>
Następujące przykładowe polecenie jest wykonywane w celu wyświetlenia wszystkich tabel:
hive> show tables;
OK
Time taken: 2.798 seconds
hive>
W tym rozdziale omówiono różne typy danych w gałęzi Hive, które są zaangażowane w tworzenie tabeli. Wszystkie typy danych w gałęzi Hive są podzielone na cztery typy, podane w następujący sposób:
- Typy kolumn
- Literals
- Wartości zerowe
- Złożone typy
Typy kolumn
Typ kolumny jest używany jako typy danych kolumn w gałęzi. Są one następujące:
Typy całkowe
Dane typu całkowitego można określić za pomocą integralnych typów danych, INT. Gdy zakres danych przekracza zakres INT, musisz użyć BIGINT, a jeśli zakres danych jest mniejszy niż INT, używasz SMALLINT. TINYINT jest mniejszy niż SMALLINT.
Poniższa tabela przedstawia różne typy danych INT:
Rodzaj | Przyrostek | Przykład |
---|---|---|
TINYINT | Y | 10Y |
SMALLINT | S | 10S |
INT | - | 10 |
BIGINT | L | 10l |
Typy strun
Typy danych typu łańcuchowego można określić za pomocą apostrofów ('') lub podwójnych cudzysłowów (""). Zawiera dwa typy danych: VARCHAR i CHAR. Hive podąża za znakami ucieczki typu C.
Poniższa tabela przedstawia różne typy danych CHAR:
Typ danych | Długość |
---|---|
VARCHAR | 1 do 65355 |
ZWĘGLAĆ | 255 |
Znak czasu
Obsługuje tradycyjny znacznik czasu UNIX z opcjonalną precyzją nanosekund. Obsługuje format java.sql.Timestamp „RRRR-MM-DD GG: MM: SS.fffffffff” i format „rrrr-mm-dd gg: mm: ss.ffffffffff”.
Daktyle
Wartości DAT są opisane w formacie rok / miesiąc / dzień w postaci {{RRRR-MM-DD}}.
Ułamki dziesiętne
Typ DECIMAL w gałęzi Hive jest taki sam jak format Big Decimal języka Java. Służy do reprezentowania niezmiennej dowolnej precyzji. Składnia i przykład są następujące:
DECIMAL(precision, scale)
decimal(10,0)
Typy związków
Unia to zbiór heterogenicznych typów danych. Możesz utworzyć instancję za pomocącreate union. Składnia i przykład są następujące:
UNIONTYPE<int, double, array<string>, struct<a:int,b:string>>
{0:1}
{1:2.0}
{2:["three","four"]}
{3:{"a":5,"b":"five"}}
{2:["six","seven"]}
{3:{"a":8,"b":"eight"}}
{0:9}
{1:10.0}
Literały
Następujące literały są używane w gałęzi:
Typy zmiennoprzecinkowe
Typy zmiennoprzecinkowe to nic innego jak liczby z kropkami dziesiętnymi. Generalnie ten typ danych składa się z typu DOUBLE.
Typ dziesiętny
-308 308,Wartość zerowa
Brakujące wartości są reprezentowane przez specjalną wartość NULL.
Złożone typy
Złożone typy danych Hive są następujące:
Tablice
Tablice w Hive są używane w taki sam sposób, w jaki są używane w Javie.
Składnia: ARRAY <typ_danych>
Mapy
Mapy w Hive są podobne do map Java.
Składnia: MAP <typ_prymitywny, typ_danych>
Struktury
Struktury w gałęzi Hive są podobne do używania złożonych danych z komentarzem.
Składnia: STRUCT <nazwa_kolumny: typ_danych [KOMENTARZ_KOMENT], ...>
Hive to technologia baz danych, która umożliwia definiowanie baz danych i tabel w celu analizy danych strukturalnych. Tematem analizy danych strukturalnych jest przechowywanie danych w sposób tabelaryczny i przekazywanie zapytań w celu ich analizy. W tym rozdziale wyjaśniono, jak utworzyć bazę danych Hive. Hive zawiera domyślną bazę danych o nazwiedefault.
Utwórz instrukcję bazy danych
Utwórz bazę danych to instrukcja używana do tworzenia bazy danych w programie Hive. Baza danych w Hive to pliknamespacelub zbiór tabel. Pliksyntax dla tego stwierdzenia jest następująca:
CREATE DATABASE|SCHEMA [IF NOT EXISTS] <database name>
W tym przypadku IF NOT EXISTS to opcjonalna klauzula, która powiadamia użytkownika, że baza danych o tej samej nazwie już istnieje. Możemy użyć SCHEMA zamiast DATABASE w tym poleceniu. Następujące zapytanie jest wykonywane w celu utworzenia bazy danych o nazwieuserdb:
hive> CREATE DATABASE [IF NOT EXISTS] userdb;
or
hive> CREATE SCHEMA userdb;
Następujące zapytanie służy do weryfikacji listy baz danych:
hive> SHOW DATABASES;
default
userdb
Program JDBC
Poniżej przedstawiono program JDBC do tworzenia bazy danych.
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet; 4. CREATE DATABASE
import java.sql.Statement;
import java.sql.DriverManager;
public class HiveCreateDb {
private static String driverName =
"org.apache.hadoop.hive.jdbc.HiveDriver";
public static void main(String[] args) throws SQLException {
// Register driver and create driver instance
Class.forName(driverName);
// get connection
Connection con = DriverManager.
getConnection("jdbc:hive://localhost:10000/default", "", "");
Statement stmt = con.createStatement();
stmt.executeQuery("CREATE DATABASE userdb");
System.out.println(“Database userdb created successfully.”);
con.close();
}
}
Zapisz program w pliku o nazwie HiveCreateDb.java. Poniższe polecenia służą do kompilowania i wykonywania tego programu.
$ javac HiveCreateDb.java $ java HiveCreateDb
Wynik:
Database userdb created successfully.
W tym rozdziale opisano sposób usuwania bazy danych w programie Hive. Korzystanie ze SCHEMATÓW i BAZ DANYCH jest takie samo.
Instrukcja usuwania bazy danych
Drop Database to instrukcja, która usuwa wszystkie tabele i usuwa bazę danych. Jego składnia jest następująca:
DROP DATABASE StatementDROP (DATABASE|SCHEMA) [IF EXISTS] database_name
[RESTRICT|CASCADE];
Poniższe zapytania służą do usuwania bazy danych. Załóżmy, że nazwa bazy danych touserdb.
hive> DROP DATABASE IF EXISTS userdb;
Następujące zapytanie usuwa bazę danych przy użyciu CASCADE. Oznacza to usunięcie odpowiednich tabel przed usunięciem bazy danych.
hive> DROP DATABASE IF EXISTS userdb CASCADE;
Następujące zapytanie usuwa bazę danych przy użyciu SCHEMA.
hive> DROP SCHEMA userdb;
Ta klauzula została dodana w Hive 0.6.
Program JDBC
Program JDBC do usuwania bazy danych jest podany poniżej.
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager; 5. DROP DATABASE
public class HiveDropDb {
private static String driverName =
"org.apache.hadoop.hive.jdbc.HiveDriver";
public static void main(String[] args) throws SQLException {
// Register driver and create driver instance
Class.forName(driverName);
// get connection
Connection con = DriverManager.
getConnection("jdbc:hive://localhost:10000/default", "", "");
Statement stmt = con.createStatement();
stmt.executeQuery("DROP DATABASE userdb");
System.out.println(“Drop userdb database successful.”);
con.close();
}
}
Zapisz program w pliku o nazwie HiveDropDb.java. Poniżej podano polecenia kompilacji i wykonania tego programu.
$ javac HiveDropDb.java $ java HiveDropDb
Wynik:
Drop userdb database successful.
W tym rozdziale wyjaśniono, jak utworzyć tabelę i wstawiać do niej dane. Konwencja tworzenia tabeli w HIVE jest bardzo podobna do tworzenia tabeli przy użyciu języka SQL.
Utwórz instrukcję tabeli
Utwórz tabelę to instrukcja używana do tworzenia tabeli w gałęzi. Składnia i przykład są następujące:
Składnia
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[ROW FORMAT row_format]
[STORED AS file_format]
Przykład
Załóżmy, że musisz utworzyć tabelę o nazwie employee za pomocą CREATE TABLEkomunikat. W poniższej tabeli wymieniono pola i ich typy danych w tabeli pracowników:
Sr.No | Nazwa pola | Typ danych |
---|---|---|
1 | Eid | int |
2 | Nazwa | Strunowy |
3 | Wynagrodzenie | Pływak |
4 | Przeznaczenie | strunowy |
Następujące dane to komentarz, pola sformatowane w wierszach, takie jak terminator pola, terminator wierszy i typ zapisanego pliku.
COMMENT ‘Employee details’
FIELDS TERMINATED BY ‘\t’
LINES TERMINATED BY ‘\n’
STORED IN TEXT FILE
Następujące zapytanie tworzy tabelę o nazwie employee korzystając z powyższych danych.
hive> CREATE TABLE IF NOT EXISTS employee ( eid int, name String,
> salary String, destination String)
> COMMENT ‘Employee details’
> ROW FORMAT DELIMITED
> FIELDS TERMINATED BY ‘\t’
> LINES TERMINATED BY ‘\n’
> STORED AS TEXTFILE;
Jeśli dodasz opcję JEŚLI NIE ISTNIEJE, gałąź zignoruje instrukcję w przypadku, gdy tabela już istnieje.
Po pomyślnym utworzeniu tabeli zobaczysz następującą odpowiedź:
OK
Time taken: 5.905 seconds
hive>
Program JDBC
Podano przykład programu JDBC do tworzenia tabeli.
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;
public class HiveCreateTable {
private static String driverName =
"org.apache.hadoop.hive.jdbc.HiveDriver";
public static void main(String[] args) throws SQLException {
// Register driver and create driver instance
Class.forName(driverName);
// get connection
Connection con = DriverManager.
getConnection("jdbc:hive://localhost:10000/userdb", "", "");
// create statement
Statement stmt = con.createStatement();
// execute statement
stmt.executeQuery("CREATE TABLE IF NOT EXISTS "
+" employee ( eid int, name String, "
+" salary String, destignation String)"
+" COMMENT ‘Employee details’"
+" ROW FORMAT DELIMITED"
+" FIELDS TERMINATED BY ‘\t’"
+" LINES TERMINATED BY ‘\n’"
+" STORED AS TEXTFILE;");
System.out.println(“ Table employee created.”);
con.close();
}
}
Zapisz program w pliku o nazwie HiveCreateDb.java. Poniższe polecenia służą do kompilowania i wykonywania tego programu.
$ javac HiveCreateDb.java $ java HiveCreateDb
Wynik
Table employee created.
Instrukcja ładowania danych
Generalnie po utworzeniu tabeli w SQL możemy wstawiać dane za pomocą instrukcji Insert. Ale w Hive możemy wstawiać dane za pomocą instrukcji LOAD DATA.
Podczas wstawiania danych do Hive lepiej jest używać LOAD DATA do przechowywania rekordów zbiorczych. Istnieją dwa sposoby ładowania danych: jeden z lokalnego systemu plików, a drugi z systemu plików Hadoop.
Syntex
Składnia danych ładowania jest następująca:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename
[PARTITION (partcol1=val1, partcol2=val2 ...)]
- LOCAL to identyfikator określający ścieżkę lokalną. Jest to opcjonalne.
- OVERWRITE jest opcjonalne, aby nadpisać dane w tabeli.
- PARTYCJA jest opcjonalna.
Przykład
Do tabeli wstawimy następujące dane. Jest to plik tekstowy o nazwiesample.txt w /home/user informator.
1201 Gopal 45000 Technical manager
1202 Manisha 45000 Proof reader
1203 Masthanvali 40000 Technical writer
1204 Krian 40000 Hr Admin
1205 Kranthi 30000 Op Admin
Następujące zapytanie ładuje podany tekst do tabeli.
hive> LOAD DATA LOCAL INPATH '/home/user/sample.txt'
> OVERWRITE INTO TABLE employee;
Po pomyślnym pobraniu zobaczysz następującą odpowiedź:
OK
Time taken: 15.905 seconds
hive>
Program JDBC
Poniżej podano program JDBC do załadowania danych do tabeli.
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;
public class HiveLoadData {
private static String driverName =
"org.apache.hadoop.hive.jdbc.HiveDriver";
public static void main(String[] args) throws SQLException {
// Register driver and create driver instance
Class.forName(driverName);
// get connection
Connection con = DriverManager.
getConnection("jdbc:hive://localhost:10000/userdb", "", "");
// create statement
Statement stmt = con.createStatement();
// execute statement
stmt.executeQuery("LOAD DATA LOCAL INPATH '/home/user/sample.txt'"
+"OVERWRITE INTO TABLE employee;");
System.out.println("Load Data into employee successful");
con.close();
}
}
Zapisz program w pliku o nazwie HiveLoadData.java. Użyj następujących poleceń, aby skompilować i uruchomić ten program.
$ javac HiveLoadData.java $ java HiveLoadData
Wynik:
Load Data into employee successful
W tym rozdziale wyjaśniono, jak zmienić atrybuty tabeli, takie jak zmiana nazwy tabeli, zmiana nazw kolumn, dodawanie kolumn oraz usuwanie lub zastępowanie kolumn.
Alter Table Statement
Służy do zmiany tabeli w Hive.
Składnia
Instrukcja przyjmuje dowolną z poniższych składni w oparciu o atrybuty, które chcemy zmodyfikować w tabeli.
ALTER TABLE name RENAME TO new_name
ALTER TABLE name ADD COLUMNS (col_spec[, col_spec ...])
ALTER TABLE name DROP [COLUMN] column_name
ALTER TABLE name CHANGE column_name new_name new_type
ALTER TABLE name REPLACE COLUMNS (col_spec[, col_spec ...])
Rename To… Statement
Następujące zapytanie zmienia nazwę tabeli z employee do emp.
hive> ALTER TABLE employee RENAME TO emp;
Program JDBC
Program JDBC do zmiany nazwy tabeli jest następujący.
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;
public class HiveAlterRenameTo {
private static String driverName =
"org.apache.hadoop.hive.jdbc.HiveDriver";
public static void main(String[] args) throws SQLException {
// Register driver and create driver instance
Class.forName(driverName);
// get connection
Connection con = DriverManager.
getConnection("jdbc:hive://localhost:10000/userdb", "", "");
// create statement
Statement stmt = con.createStatement();
// execute statement
stmt.executeQuery("ALTER TABLE employee RENAME TO emp;");
System.out.println("Table Renamed Successfully");
con.close();
}
}
Zapisz program w pliku o nazwie HiveAlterRenameTo.java. Użyj następujących poleceń, aby skompilować i uruchomić ten program.
$ javac HiveAlterRenameTo.java $ java HiveAlterRenameTo
Wynik:
Table renamed successfully.
Zmiana oświadczenia
Poniższa tabela zawiera pola employee tabela i pokazuje pola do zmiany (pogrubione).
Nazwa pola | Konwertuj z typu danych | Zmień nazwę pola | Konwertuj na typ danych |
---|---|---|---|
eid | int | eid | int |
name | Strunowy | ename | Strunowy |
wynagrodzenie | Float | wynagrodzenie | Double |
Przeznaczenie | Strunowy | Przeznaczenie | Strunowy |
Poniższe zapytania zmieniają nazwę kolumny i typ danych kolumny przy użyciu powyższych danych:
hive> ALTER TABLE employee CHANGE name ename String;
hive> ALTER TABLE employee CHANGE salary salary Double;
Program JDBC
Poniżej podano program JDBC do zmiany kolumny.
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;
public class HiveAlterChangeColumn {
private static String driverName =
"org.apache.hadoop.hive.jdbc.HiveDriver";
public static void main(String[] args) throws SQLException {
// Register driver and create driver instance
Class.forName(driverName);
// get connection
Connection con = DriverManager.
getConnection("jdbc:hive://localhost:10000/userdb", "", "");
// create statement
Statement stmt = con.createStatement();
// execute statement
stmt.executeQuery("ALTER TABLE employee CHANGE name ename String;");
stmt.executeQuery("ALTER TABLE employee CHANGE salary salary Double;");
System.out.println("Change column successful.");
con.close();
}
}
Zapisz program w pliku o nazwie HiveAlterChangeColumn.java. Użyj następujących poleceń, aby skompilować i uruchomić ten program.
$ javac HiveAlterChangeColumn.java $ java HiveAlterChangeColumn
Wynik:
Change column successful.
Add Columns Statement
Następujące zapytanie dodaje kolumnę o nazwie dział do tabeli pracowników.
hive> ALTER TABLE employee ADD COLUMNS (
> dept STRING COMMENT 'Department name');
Program JDBC
Program JDBC do dodawania kolumny do tabeli jest podany poniżej.
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;
public class HiveAlterAddColumn {
private static String driverName =
"org.apache.hadoop.hive.jdbc.HiveDriver";
public static void main(String[] args) throws SQLException {
// Register driver and create driver instance
Class.forName(driverName);
// get connection
Connection con = DriverManager.
getConnection("jdbc:hive://localhost:10000/userdb", "", "");
// create statement
Statement stmt = con.createStatement();
// execute statement
stmt.executeQuery("ALTER TABLE employee ADD COLUMNS "
+" (dept STRING COMMENT 'Department name');");
System.out.prinln("Add column successful.");
con.close();
}
}
Zapisz program w pliku o nazwie HiveAlterAddColumn.java. Użyj następujących poleceń, aby skompilować i uruchomić ten program.
$ javac HiveAlterAddColumn.java $ java HiveAlterAddColumn
Wynik:
Add column successful.
Zastąp instrukcję
Następujące zapytanie usuwa wszystkie kolumny z employee table i zastępuje go emp i name kolumny:
hive> ALTER TABLE employee REPLACE COLUMNS (
> eid INT empid Int,
> ename STRING name String);
Program JDBC
Poniżej podano program JDBC do wymiany eid kolumna z empid i ename kolumna z name.
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;
public class HiveAlterReplaceColumn {
private static String driverName =
"org.apache.hadoop.hive.jdbc.HiveDriver";
public static void main(String[] args) throws SQLException {
// Register driver and create driver instance
Class.forName(driverName);
// get connection
Connection con = DriverManager.
getConnection("jdbc:hive://localhost:10000/userdb", "", "");
// create statement
Statement stmt = con.createStatement();
// execute statement
stmt.executeQuery("ALTER TABLE employee REPLACE COLUMNS "
+" (eid INT empid Int,"
+" ename STRING name String);");
System.out.println(" Replace column successful");
con.close();
}
}
Zapisz program w pliku o nazwie HiveAlterReplaceColumn.java. Użyj następujących poleceń, aby skompilować i uruchomić ten program.
$ javac HiveAlterReplaceColumn.java $ java HiveAlterReplaceColumn
Wynik:
Replace column successful.
W tym rozdziale opisano, jak upuścić tabelę w gałęzi. Usunięcie tabeli z Hive Metastore powoduje usunięcie danych tabeli / kolumny i ich metadanych. Może to być zwykła tabela (przechowywana w Metastore) lub tabela zewnętrzna (przechowywana w lokalnym systemie plików); Hive traktuje oba w ten sam sposób, niezależnie od ich typów.
Instrukcja Drop Table
Składnia jest następująca:
DROP TABLE [IF EXISTS] table_name;
Następujące zapytanie usuwa tabelę o nazwie employee:
hive> DROP TABLE IF EXISTS employee;
Po pomyślnym wykonaniu zapytania zobaczysz następującą odpowiedź:
OK
Time taken: 5.3 seconds
hive>
Program JDBC
Poniższy program JDBC usuwa tabelę pracowników.
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;
public class HiveDropTable {
private static String driverName =
"org.apache.hadoop.hive.jdbc.HiveDriver";
public static void main(String[] args) throws SQLException {
// Register driver and create driver instance
Class.forName(driverName);
// get connection
Connection con = DriverManager.
getConnection("jdbc:hive://localhost:10000/userdb", "", "");
// create statement
Statement stmt = con.createStatement();
// execute statement
stmt.executeQuery("DROP TABLE IF EXISTS employee;");
System.out.println("Drop table successful.");
con.close();
}
}
Zapisz program w pliku o nazwie HiveDropTable.java. Użyj następujących poleceń, aby skompilować i uruchomić ten program.
$ javac HiveDropTable.java $ java HiveDropTable
Wynik:
Drop table successful
Poniższe zapytanie służy do weryfikacji listy tabel:
hive> SHOW TABLES;
emp
ok
Time taken: 2.1 seconds
hive>
Hive organizuje tabele w partycje. Jest to sposób na podzielenie tabeli na powiązane części na podstawie wartości podzielonych kolumn, takich jak data, miasto i dział. Korzystając z partycji, można łatwo przeszukać część danych.
Tabele lub partycje są podzielone na buckets,zapewnienie dodatkowej struktury danych, które mogą być używane do wydajniejszego wykonywania zapytań. Bucketing działa w oparciu o wartość funkcji skrótu jakiejś kolumny tabeli.
Na przykład tabela o nazwie Tab1zawiera dane pracownika, takie jak identyfikator, imię i nazwisko, dział i rok (tj. rok przystąpienia). Załóżmy, że musisz pobrać szczegóły wszystkich pracowników, którzy dołączyli w 2012 roku. Zapytanie przeszukuje całą tabelę w celu znalezienia wymaganych informacji. Jeśli jednak podzielisz dane pracowników według roku i zapiszesz je w oddzielnym pliku, skróci to czas przetwarzania zapytania. Poniższy przykład pokazuje, jak podzielić plik i jego dane na partycje:
Poniższy plik zawiera tabelę Employeedata.
/ tab1 / Employeedata / file1
id, imię, dział, yoj
1, gopal, TP, 2012
2, kiran, HR, 2012
3, kaleel, SC, 2013
4, Prasanth, SC, 2013
Powyższe dane są podzielone na dwa pliki przy użyciu roku.
/ tab1 / Employeedata / 2012 / file2
1, gopal, TP, 2012
2, kiran, HR, 2012
/ tab1 / Employeedata / 2013 / file3
3, kaleel, SC, 2013
4, Prasanth, SC, 2013
Dodawanie partycji
Możemy dodać partycje do tabeli, zmieniając tabelę. Załóżmy, że mamy tabelę o nazwieemployee z polami takimi jak identyfikator, imię i nazwisko, wynagrodzenie, stanowisko, dział i rok.
Składnia:
ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec
[LOCATION 'location1'] partition_spec [LOCATION 'location2'] ...;
partition_spec:
: (p_column = p_col_value, p_column = p_col_value, ...)
Poniższe zapytanie służy do dodawania partycji do tabeli pracowników.
hive> ALTER TABLE employee
> ADD PARTITION (year=’2012’)
> location '/2012/part2012';
Zmiana nazwy partycji
Składnia tego polecenia jest następująca.
ALTER TABLE table_name PARTITION partition_spec RENAME TO PARTITION partition_spec;
Następujące zapytanie służy do zmiany nazwy partycji:
hive> ALTER TABLE employee PARTITION (year=’1203’)
> RENAME TO PARTITION (Yoj=’1203’);
Upuszczanie partycji
Następująca składnia służy do usuwania partycji:
ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec, PARTITION partition_spec,...;
Następujące zapytanie służy do usuwania partycji:
hive> ALTER TABLE employee DROP [IF EXISTS]
> PARTITION (year=’1203’);
W tym rozdziale opisano wbudowane operatory Hive. W Hive istnieją cztery typy operatorów:
- Operatorzy relacyjni
- Operatory arytmetyczne
- Operatory logiczne
- Złożone operatory
Operatorzy relacyjni
Te operatory służą do porównywania dwóch operandów. W poniższej tabeli opisano operatory relacji dostępne w gałęzi:
Operator | Operand | Opis |
---|---|---|
A = B. | wszystkie typy pierwotne | PRAWDA, jeśli wyrażenie A jest równoważne wyrażeniu B, w przeciwnym razie FAŁSZ. |
A! = B | wszystkie typy pierwotne | PRAWDA, jeśli wyrażenie A nie jest równoważne wyrażeniu B, w przeciwnym razie FAŁSZ. |
A <B | wszystkie typy pierwotne | PRAWDA, jeśli wyrażenie A jest mniejsze niż wyrażenie B, w przeciwnym razie FAŁSZ. |
A <= B | wszystkie typy pierwotne | PRAWDA, jeśli wyrażenie A jest mniejsze lub równe wyrażeniu B, w przeciwnym razie FAŁSZ. |
A> B | wszystkie typy pierwotne | PRAWDA, jeśli wyrażenie A jest większe niż wyrażenie B, w przeciwnym razie FAŁSZ. |
A> = B | wszystkie typy pierwotne | PRAWDA, jeśli wyrażenie A jest większe lub równe wyrażeniu B, w przeciwnym razie FAŁSZ. |
A IS NULL | wszystkie typy | PRAWDA, jeśli wyrażenie A ma wartość NULL, w przeciwnym razie FAŁSZ. |
NIE JEST NULL | wszystkie typy | FALSE, jeśli wyrażenie A ma wartość NULL, w przeciwnym razie PRAWDA. |
PODOBNE B | Smyczki | PRAWDA, jeśli wzorzec łańcucha A pasuje do B, w przeciwnym razie FAŁSZ. |
A RLIKE B | Smyczki | NULL, jeśli A lub B ma wartość NULL, TRUE, jeśli dowolny podciąg A pasuje do wyrażenia regularnego Java B, w przeciwnym razie FALSE. |
A REGEXP B. | Smyczki | To samo co RLIKE. |
Przykład
Załóżmy, że employeeTabela składa się z pól o nazwach Id, Imię i Nazwisko, Wynagrodzenie, Oznaczenie i Dział, jak pokazano poniżej. Wygeneruj zapytanie, aby pobrać dane pracownika, których identyfikator to 1205.
+-----+--------------+--------+---------------------------+------+
| Id | Name | Salary | Designation | Dept |
+-----+--------------+------------------------------------+------+
|1201 | Gopal | 45000 | Technical manager | TP |
|1202 | Manisha | 45000 | Proofreader | PR |
|1203 | Masthanvali | 40000 | Technical writer | TP |
|1204 | Krian | 40000 | Hr Admin | HR |
|1205 | Kranthi | 30000 | Op Admin | Admin|
+-----+--------------+--------+---------------------------+------+
Następujące zapytanie jest wykonywane w celu pobrania danych pracownika przy użyciu powyższej tabeli:
hive> SELECT * FROM employee WHERE Id=1205;
Po pomyślnym wykonaniu zapytania zobaczysz następującą odpowiedź:
+-----+-----------+-----------+----------------------------------+
| ID | Name | Salary | Designation | Dept |
+-----+---------------+-------+----------------------------------+
|1205 | Kranthi | 30000 | Op Admin | Admin |
+-----+-----------+-----------+----------------------------------+
Następujące zapytanie jest wykonywane w celu pobrania szczegółów pracownika, którego wynagrodzenie jest większe lub równe 40000 Rs.
hive> SELECT * FROM employee WHERE Salary>=40000;
Po pomyślnym wykonaniu zapytania zobaczysz następującą odpowiedź:
+-----+------------+--------+----------------------------+------+
| ID | Name | Salary | Designation | Dept |
+-----+------------+--------+----------------------------+------+
|1201 | Gopal | 45000 | Technical manager | TP |
|1202 | Manisha | 45000 | Proofreader | PR |
|1203 | Masthanvali| 40000 | Technical writer | TP |
|1204 | Krian | 40000 | Hr Admin | HR |
+-----+------------+--------+----------------------------+------+
Operatory arytmetyczne
Te operatory obsługują różne typowe operacje arytmetyczne na operandach. Wszystkie zwracają typy liczbowe. W poniższej tabeli opisano operatory arytmetyczne dostępne w gałęzi:
Operatorzy | Operand | Opis |
---|---|---|
A + B | wszystkie typy liczb | Daje wynik dodania A i B. |
A - B | wszystkie typy liczb | Daje wynik odjęcia B od A. |
A * B | wszystkie typy liczb | Daje wynik pomnożenia A i B. |
A / B | wszystkie typy liczb | Daje wynik podzielenia B od A. |
A% B | wszystkie typy liczb | Daje przypomnienie wynikające z podzielenia A przez B. |
A i B. | wszystkie typy liczb | Daje wynik bitowego AND z A i B. |
A | b | wszystkie typy liczb | Daje wynik bitowego OR A i B. |
A ^ B | wszystkie typy liczb | Daje wynik bitowej XOR A i B. |
~ A | wszystkie typy liczb | Daje wynik bitowego NIE A. |
Przykład
Poniższe zapytanie dodaje dwie liczby, 20 i 30.
hive> SELECT 20+30 ADD FROM temp;
Po pomyślnym wykonaniu zapytania zobaczysz następującą odpowiedź:
+--------+
| ADD |
+--------+
| 50 |
+--------+
Operatory logiczne
Operatory są wyrażeniami logicznymi. Wszystkie zwracają PRAWDA lub FAŁSZ.
Operatorzy | Operandy | Opis |
---|---|---|
A AND B | boolean | PRAWDA, jeśli zarówno A, jak i B są PRAWDA, w przeciwnym razie FAŁSZ. |
A && B. | boolean | To samo co A AND B. |
A LUB B | boolean | PRAWDA, jeśli A lub B lub oba są PRAWDA, w przeciwnym razie FAŁSZ. |
A || b | boolean | To samo co A LUB B. |
ANI | boolean | PRAWDA, jeśli A jest FAŁSZEM, w przeciwnym razie FAŁSZ. |
!ZA | boolean | To samo, co NOT A. |
Przykład
Poniższe zapytanie służy do pobierania danych pracowników, których działem jest TP, a wynagrodzenie przekracza 40000 Rs.
hive> SELECT * FROM employee WHERE Salary>40000 && Dept=TP;
Po pomyślnym wykonaniu zapytania zobaczysz następującą odpowiedź:
+------+--------------+-------------+-------------------+--------+
| ID | Name | Salary | Designation | Dept |
+------+--------------+-------------+-------------------+--------+
|1201 | Gopal | 45000 | Technical manager | TP |
+------+--------------+-------------+-------------------+--------+
Złożone operatory
Te operatory zapewniają wyrażenie umożliwiające dostęp do elementów typów złożonych.
Operator | Operand | Opis |
---|---|---|
Na] | A to Array, a n to int | Zwraca n-ty element tablicy A. Pierwszy element ma indeks 0. |
M [klucz] | M to Mapa <K, V>, a klucz ma typ K. | Zwraca wartość odpowiadającą kluczowi na mapie. |
Sx | S jest strukturą | Zwraca pole x S. |
Hive Query Language (HiveQL) to język zapytań służący do przetwarzania i analizowania danych strukturalnych w Metastore. W tym rozdziale wyjaśniono, jak używać instrukcji SELECT z klauzulą WHERE.
Instrukcja SELECT służy do pobierania danych z tabeli. Klauzula WHERE działa podobnie do warunku. Filtruje dane przy użyciu warunku i daje skończony wynik. Wbudowane operatory i funkcje generują wyrażenie, które spełnia warunek.
Składnia
Poniżej podano składnię zapytania SELECT:
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[HAVING having_condition]
[CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY col_list]]
[LIMIT number];
Przykład
Weźmy przykład dla klauzuli SELECT… WHERE. Załóżmy, że mamy tabelę pracowników podaną poniżej, z polami o nazwach Id, Imię i Nazwisko, Wynagrodzenie, Oznaczenie i Dział. Wygeneruj zapytanie, aby pobrać dane pracownika, którzy zarabiają ponad 30000 Rs.
+------+--------------+-------------+-------------------+--------+
| ID | Name | Salary | Designation | Dept |
+------+--------------+-------------+-------------------+--------+
|1201 | Gopal | 45000 | Technical manager | TP |
|1202 | Manisha | 45000 | Proofreader | PR |
|1203 | Masthanvali | 40000 | Technical writer | TP |
|1204 | Krian | 40000 | Hr Admin | HR |
|1205 | Kranthi | 30000 | Op Admin | Admin |
+------+--------------+-------------+-------------------+--------+
Następujące zapytanie pobiera dane pracownika przy użyciu powyższego scenariusza:
hive> SELECT * FROM employee WHERE salary>30000;
Po pomyślnym wykonaniu zapytania zobaczysz następującą odpowiedź:
+------+--------------+-------------+-------------------+--------+
| ID | Name | Salary | Designation | Dept |
+------+--------------+-------------+-------------------+--------+
|1201 | Gopal | 45000 | Technical manager | TP |
|1202 | Manisha | 45000 | Proofreader | PR |
|1203 | Masthanvali | 40000 | Technical writer | TP |
|1204 | Krian | 40000 | Hr Admin | HR |
+------+--------------+-------------+-------------------+--------+
Program JDBC
Program JDBC do zastosowania klauzula where dla podanego przykładu jest następujący.
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;
public class HiveQLWhere {
private static String driverName =
"org.apache.hadoop.hive.jdbc.HiveDriver";
public static void main(String[] args) throws SQLException {
// Register driver and create driver instance
Class.forName(driverName);
// get connection
Connection con = DriverManager.
getConnection("jdbc:hive://localhost:10000/userdb", "", "");
// create statement
Statement stmt = con.createStatement();
// execute statement
Resultset res = stmt.executeQuery("SELECT * FROM employee WHERE
salary>30000;");
System.out.println("Result:");
System.out.println(" ID \t Name \t Salary \t Designation \t Dept ");
while (res.next()) {
System.out.println(res.getInt(1)+" "+ res.getString(2)+" "+
res.getDouble(3)+" "+ res.getString(4)+" "+ res.getString(5));
}
con.close();
}
}
Zapisz program w pliku o nazwie HiveQLWhere.java. Użyj następujących poleceń, aby skompilować i uruchomić ten program.
$ javac HiveQLWhere.java $ java HiveQLWhere
Wynik:
ID Name Salary Designation Dept
1201 Gopal 45000 Technical manager TP
1202 Manisha 45000 Proofreader PR
1203 Masthanvali 40000 Technical writer TP
1204 Krian 40000 Hr Admin HR
W tym rozdziale wyjaśniono, jak używać klauzuli ORDER BY w instrukcji SELECT. Klauzula ORDER BY służy do pobierania szczegółów na podstawie jednej kolumny i sortowania zestawu wyników w kolejności rosnącej lub malejącej.
Składnia
Poniżej podano składnię klauzuli ORDER BY:
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[HAVING having_condition]
[ORDER BY col_list]]
[LIMIT number];
Przykład
Weźmy przykład dla klauzuli SELECT ... ORDER BY. Załóż tabelę pracowników, jak podano poniżej, z polami o nazwach Identyfikator, Imię i nazwisko, Wynagrodzenie, Oznaczenie i Dział. Wygeneruj zapytanie, aby pobrać dane pracownika w kolejności, używając nazwy działu.
+------+--------------+-------------+-------------------+--------+
| ID | Name | Salary | Designation | Dept |
+------+--------------+-------------+-------------------+--------+
|1201 | Gopal | 45000 | Technical manager | TP |
|1202 | Manisha | 45000 | Proofreader | PR |
|1203 | Masthanvali | 40000 | Technical writer | TP |
|1204 | Krian | 40000 | Hr Admin | HR |
|1205 | Kranthi | 30000 | Op Admin | Admin |
+------+--------------+-------------+-------------------+--------+
Następujące zapytanie pobiera dane pracownika przy użyciu powyższego scenariusza:
hive> SELECT Id, Name, Dept FROM employee ORDER BY DEPT;
Po pomyślnym wykonaniu zapytania zobaczysz następującą odpowiedź:
+------+--------------+-------------+-------------------+--------+
| ID | Name | Salary | Designation | Dept |
+------+--------------+-------------+-------------------+--------+
|1205 | Kranthi | 30000 | Op Admin | Admin |
|1204 | Krian | 40000 | Hr Admin | HR |
|1202 | Manisha | 45000 | Proofreader | PR |
|1201 | Gopal | 45000 | Technical manager | TP |
|1203 | Masthanvali | 40000 | Technical writer | TP |
+------+--------------+-------------+-------------------+--------+
Program JDBC
Oto program JDBC do zastosowania klauzuli Order By dla podanego przykładu.
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;
public class HiveQLOrderBy {
private static String driverName =
"org.apache.hadoop.hive.jdbc.HiveDriver";
public static void main(String[] args) throws SQLException {
// Register driver and create driver instance
Class.forName(driverName);
// get connection
Connection con = DriverManager.
getConnection("jdbc:hive://localhost:10000/userdb", "", "");
// create statement
Statement stmt = con.createStatement();
// execute statement
Resultset res = stmt.executeQuery("SELECT * FROM employee ORDER BY
DEPT;");
System.out.println(" ID \t Name \t Salary \t Designation \t Dept ");
while (res.next()) {
System.out.println(res.getInt(1)+" "+ res.getString(2)+" "+
res.getDouble(3)+" "+ res.getString(4)+" "+ res.getString(5));
}
con.close();
}
}
Zapisz program w pliku o nazwie HiveQLOrderBy.java. Użyj następujących poleceń, aby skompilować i uruchomić ten program.
$ javac HiveQLOrderBy.java $ java HiveQLOrderBy
Wynik:
ID Name Salary Designation Dept
1205 Kranthi 30000 Op Admin Admin
1204 Krian 40000 Hr Admin HR
1202 Manisha 45000 Proofreader PR
1201 Gopal 45000 Technical manager TP
1203 Masthanvali 40000 Technical writer TP
1204 Krian 40000 Hr Admin HR
Ten rozdział wyjaśnia szczegóły klauzuli GROUP BY w instrukcji SELECT. Klauzula GROUP BY służy do grupowania wszystkich rekordów w zestawie wyników przy użyciu określonej kolumny kolekcji. Służy do wysyłania zapytań do grupy rekordów.
Składnia
Składnia klauzuli GROUP BY jest następująca:
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[HAVING having_condition]
[ORDER BY col_list]]
[LIMIT number];
Przykład
Weźmy przykład klauzuli SELECT… GROUP BY. Przyjmij tabelę pracowników, jak podano poniżej, z polami Id, Nazwisko, Wynagrodzenie, Oznaczenie i Dział. Wygeneruj zapytanie, aby pobrać liczbę pracowników w każdym dziale.
+------+--------------+-------------+-------------------+--------+
| ID | Name | Salary | Designation | Dept |
+------+--------------+-------------+-------------------+--------+
|1201 | Gopal | 45000 | Technical manager | TP |
|1202 | Manisha | 45000 | Proofreader | PR |
|1203 | Masthanvali | 40000 | Technical writer | TP |
|1204 | Krian | 45000 | Proofreader | PR |
|1205 | Kranthi | 30000 | Op Admin | Admin |
+------+--------------+-------------+-------------------+--------+
Następujące zapytanie pobiera dane pracownika przy użyciu powyższego scenariusza.
hive> SELECT Dept,count(*) FROM employee GROUP BY DEPT;
Po pomyślnym wykonaniu zapytania zobaczysz następującą odpowiedź:
+------+--------------+
| Dept | Count(*) |
+------+--------------+
|Admin | 1 |
|PR | 2 |
|TP | 3 |
+------+--------------+
Program JDBC
Poniżej podano program JDBC do zastosowania klauzuli Group By dla podanego przykładu.
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;
public class HiveQLGroupBy {
private static String driverName =
"org.apache.hadoop.hive.jdbc.HiveDriver";
public static void main(String[] args) throws SQLException {
// Register driver and create driver instance
Class.forName(driverName);
// get connection
Connection con = DriverManager.
getConnection("jdbc:hive://localhost:10000/userdb", "", "");
// create statement
Statement stmt = con.createStatement();
// execute statement
Resultset res = stmt.executeQuery(“SELECT Dept,count(*) ”
+“FROM employee GROUP BY DEPT; ”);
System.out.println(" Dept \t count(*)");
while (res.next()) {
System.out.println(res.getString(1)+" "+ res.getInt(2));
}
con.close();
}
}
Zapisz program w pliku o nazwie HiveQLGroupBy.java. Użyj następujących poleceń, aby skompilować i uruchomić ten program.
$ javac HiveQLGroupBy.java $ java HiveQLGroupBy
Wynik:
Dept Count(*)
Admin 1
PR 2
TP 3
JOINS to klauzula używana do łączenia określonych pól z dwóch tabel przy użyciu wartości wspólnych dla każdej z nich. Służy do łączenia rekordów z dwóch lub więcej tabel w bazie danych.
Składnia
join_table:
table_reference JOIN table_factor [join_condition]
| table_reference {LEFT|RIGHT|FULL} [OUTER] JOIN table_reference
join_condition
| table_reference LEFT SEMI JOIN table_reference join_condition
| table_reference CROSS JOIN table_reference [join_condition]
Przykład
W tym rozdziale wykorzystamy następujące dwie tabele. Rozważmy poniższą tabelę o nazwie CUSTOMERS.
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
Rozważ inną tabelę ZAMÓWIENIA w następujący sposób:
+-----+---------------------+-------------+--------+
|OID | DATE | CUSTOMER_ID | AMOUNT |
+-----+---------------------+-------------+--------+
| 102 | 2009-10-08 00:00:00 | 3 | 3000 |
| 100 | 2009-10-08 00:00:00 | 3 | 1500 |
| 101 | 2009-11-20 00:00:00 | 2 | 1560 |
| 103 | 2008-05-20 00:00:00 | 4 | 2060 |
+-----+---------------------+-------------+--------+
Istnieją różne typy sprzężeń podane w następujący sposób:
- JOIN
- LEWE POŁĄCZENIE ZEWNĘTRZNE
- PRAWE ZEWNĘTRZNE POŁĄCZENIE
- PEŁNE POŁĄCZENIE ZEWNĘTRZNE
PRZYSTĄP
Klauzula JOIN służy do łączenia i pobierania rekordów z wielu tabel. JOIN jest tym samym, co OUTER JOIN w SQL. Warunek JOIN należy wywołać za pomocą kluczy podstawowych i kluczy obcych tabel.
Następujące zapytanie wykonuje JOIN w tabelach CUSTOMER i ORDER oraz pobiera rekordy:
hive> SELECT c.ID, c.NAME, c.AGE, o.AMOUNT
> FROM CUSTOMERS c JOIN ORDERS o
> ON (c.ID = o.CUSTOMER_ID);
Po pomyślnym wykonaniu zapytania zobaczysz następującą odpowiedź:
+----+----------+-----+--------+
| ID | NAME | AGE | AMOUNT |
+----+----------+-----+--------+
| 3 | kaushik | 23 | 3000 |
| 3 | kaushik | 23 | 1500 |
| 2 | Khilan | 25 | 1560 |
| 4 | Chaitali | 25 | 2060 |
+----+----------+-----+--------+
LEWE POŁĄCZENIE ZEWNĘTRZNE
HiveQL LEFT OUTER JOIN zwraca wszystkie wiersze z lewej tabeli, nawet jeśli w prawej tabeli nie ma żadnych dopasowań. Oznacza to, że jeśli klauzula ON pasuje do 0 (zero) rekordów w prawej tabeli, JOIN nadal zwraca wiersz w wyniku, ale z wartością NULL w każdej kolumnie z prawej tabeli.
LEFT JOIN zwraca wszystkie wartości z lewej tabeli oraz dopasowane wartości z prawej tabeli lub NULL w przypadku braku zgodnego predykatu JOIN.
Poniższe zapytanie demonstruje LEFT OUTER JOIN między tabelami CUSTOMER i ORDER:
hive> SELECT c.ID, c.NAME, o.AMOUNT, o.DATE
> FROM CUSTOMERS c
> LEFT OUTER JOIN ORDERS o
> ON (c.ID = o.CUSTOMER_ID);
Po pomyślnym wykonaniu zapytania zobaczysz następującą odpowiedź:
+----+----------+--------+---------------------+
| ID | NAME | AMOUNT | DATE |
+----+----------+--------+---------------------+
| 1 | Ramesh | NULL | NULL |
| 2 | Khilan | 1560 | 2009-11-20 00:00:00 |
| 3 | kaushik | 3000 | 2009-10-08 00:00:00 |
| 3 | kaushik | 1500 | 2009-10-08 00:00:00 |
| 4 | Chaitali | 2060 | 2008-05-20 00:00:00 |
| 5 | Hardik | NULL | NULL |
| 6 | Komal | NULL | NULL |
| 7 | Muffy | NULL | NULL |
+----+----------+--------+---------------------+
PRAWE ZEWNĘTRZNE POŁĄCZENIE
HiveQL RIGHT OUTER JOIN zwraca wszystkie wiersze z prawej tabeli, nawet jeśli nie ma żadnych dopasowań w lewej tabeli. Jeśli klauzula ON pasuje do 0 (zero) rekordów w lewej tabeli, JOIN nadal zwraca wiersz w wyniku, ale z wartością NULL w każdej kolumnie z lewej tabeli.
RIGHT JOIN zwraca wszystkie wartości z prawej tabeli plus dopasowane wartości z lewej tabeli lub NULL w przypadku braku zgodnego predykatu łączenia.
Poniższe zapytanie demonstruje RIGHT OUTER JOIN między tabelami CUSTOMER i ORDER.
hive> SELECT c.ID, c.NAME, o.AMOUNT, o.DATE
> FROM CUSTOMERS c
> RIGHT OUTER JOIN ORDERS o
> ON (c.ID = o.CUSTOMER_ID);
Po pomyślnym wykonaniu zapytania zobaczysz następującą odpowiedź:
+------+----------+--------+---------------------+
| ID | NAME | AMOUNT | DATE |
+------+----------+--------+---------------------+
| 3 | kaushik | 3000 | 2009-10-08 00:00:00 |
| 3 | kaushik | 1500 | 2009-10-08 00:00:00 |
| 2 | Khilan | 1560 | 2009-11-20 00:00:00 |
| 4 | Chaitali | 2060 | 2008-05-20 00:00:00 |
+------+----------+--------+---------------------+
PEŁNE POŁĄCZENIE ZEWNĘTRZNE
HiveQL FULL OUTER JOIN łączy rekordy lewej i prawej tabeli zewnętrznej, które spełniają warunek JOIN. Połączona tabela zawiera albo wszystkie rekordy z obu tabel, albo wypełnia wartości NULL dla brakujących dopasowań po którejkolwiek stronie.
Poniższe zapytanie demonstruje FULL OUTER JOIN między tabelami CUSTOMER i ORDER:
hive> SELECT c.ID, c.NAME, o.AMOUNT, o.DATE
> FROM CUSTOMERS c
> FULL OUTER JOIN ORDERS o
> ON (c.ID = o.CUSTOMER_ID);
Po pomyślnym wykonaniu zapytania zobaczysz następującą odpowiedź:
+------+----------+--------+---------------------+
| ID | NAME | AMOUNT | DATE |
+------+----------+--------+---------------------+
| 1 | Ramesh | NULL | NULL |
| 2 | Khilan | 1560 | 2009-11-20 00:00:00 |
| 3 | kaushik | 3000 | 2009-10-08 00:00:00 |
| 3 | kaushik | 1500 | 2009-10-08 00:00:00 |
| 4 | Chaitali | 2060 | 2008-05-20 00:00:00 |
| 5 | Hardik | NULL | NULL |
| 6 | Komal | NULL | NULL |
| 7 | Muffy | NULL | NULL |
| 3 | kaushik | 3000 | 2009-10-08 00:00:00 |
| 3 | kaushik | 1500 | 2009-10-08 00:00:00 |
| 2 | Khilan | 1560 | 2009-11-20 00:00:00 |
| 4 | Chaitali | 2060 | 2008-05-20 00:00:00 |
+------+----------+--------+---------------------+
W tym rozdziale opisano wbudowane funkcje dostępne w Hive. Funkcje wyglądają podobnie do funkcji SQL, z wyjątkiem ich użycia.
Wbudowane funkcje
Hive obsługuje następujące funkcje wbudowane:
Typ zwrotu | Podpis | Opis |
---|---|---|
BIGINT | okrągłe (podwójne a) | Zwraca zaokrągloną BIGINT wartość double. |
BIGINT | piętro (podwójne a) | Zwraca maksymalną wartość BIGINT, która jest równa lub mniejsza od double. |
BIGINT | Ceil (podwójne a) | Zwraca minimalną wartość BIGINT, która jest równa lub większa od double. |
podwójnie | rand (), rand (int seed) | Zwraca losową liczbę, która zmienia się z wiersza na wiersz. |
strunowy | concat (ciąg A, ciąg B, ...) | Zwraca ciąg wynikający z konkatenacji B po A. |
strunowy | substr (ciąg A, int start) | Zwraca podłańcuch A, zaczynając od pozycji początkowej do końca ciągu A. |
strunowy | substr (ciąg A, int start, int length) | Zwraca podciąg A, zaczynając od pozycji początkowej o podanej długości. |
strunowy | górna (ciąg A) | Zwraca ciąg będący wynikiem konwersji wszystkich znaków A na wielkie litery. |
strunowy | ucase (ciąg A) | Tak samo jak powyżej. |
strunowy | dolny (ciąg A) | Zwraca ciąg będący wynikiem konwersji wszystkich znaków z B na małe litery. |
strunowy | lcase (ciąg A) | Tak samo jak powyżej. |
strunowy | wykończenie (ciąg A) | Zwraca ciąg wynikający z obcięcia spacji z obu końców A. |
strunowy | ltrim (ciąg A) | Zwraca ciąg wynikający z przycinania spacji z początku (lewej strony) A. |
strunowy | rtrim (ciąg A) | rtrim (string A) Zwraca ciąg wynikający z obcięcia spacji z końca (prawej strony) A. |
strunowy | regexp_replace (ciąg A, ciąg B, ciąg C) | Zwraca ciąg wynikający z zastąpienia wszystkich podciągów w B, które pasują do składni wyrażenia regularnego Java przez C. |
int | rozmiar (Mapa <KV>) | Zwraca liczbę elementów w typie mapy. |
int | rozmiar (Array <T>) | Zwraca liczbę elementów w typie tablicy. |
wartość <typ> | cast (<expr> as <type>) | Konwertuje wyniki wyrażenia wyraż na <typ>, np. Cast („1” jako BIGINT) konwertuje ciąg „1” na reprezentację całkową. Jeśli konwersja nie powiedzie się, zwracana jest wartość NULL. |
strunowy | from_unixtime (int unixtime) | przekonwertować liczbę sekund z epoki systemu Unix (1970-01-01 00:00:00 UTC) na ciąg znaków reprezentujący znacznik czasu tego momentu w bieżącej strefie czasowej systemu w formacie „1970-01-01 00:00: 00 " |
strunowy | to_date (sygnatura czasowa ciągu) | Zwraca część daty w ciągu znacznika czasu: to_date („1970-01-01 00:00:00”) = „1970-01-01” |
int | rok (data ciągu) | Zwraca część roku z daty lub ciągu znacznika czasu: rok („1970-01-01 00:00:00”) = 1970, rok („1970-01-01”) = 1970 |
int | miesiąc (string data) | Zwraca część miesiąca z daty lub ciągu znacznika czasu: miesiąc („1970-11-01 00:00:00”) = 11, miesiąc („1970-11-01”) = 11 |
int | dzień (string data) | Zwraca część dnia z daty lub ciągu znacznika czasu: day („1970-11-01 00:00:00”) = 1, day („1970-11-01”) = 1 |
strunowy | get_json_object (string json_string, string path) | Wyodrębnia obiekt json z ciągu json na podstawie określonej ścieżki json i zwraca ciąg json wyodrębnionego obiektu json. Zwraca NULL, jeśli wejściowy ciąg json jest nieprawidłowy. |
Przykład
Poniższe zapytania pokazują niektóre funkcje wbudowane:
funkcja round ()
hive> SELECT round(2.6) from temp;
Po pomyślnym wykonaniu zapytania zobaczysz następującą odpowiedź:
3.0
floor (), funkcja
hive> SELECT floor(2.6) from temp;
Po pomyślnym wykonaniu zapytania zobaczysz następującą odpowiedź:
2.0
ceil (), funkcja
hive> SELECT ceil(2.6) from temp;
Po pomyślnym wykonaniu zapytania zobaczysz następującą odpowiedź:
3.0
Funkcje agregujące
Hive obsługuje następujące wbudowane aggregate functions. Użycie tych funkcji jest takie samo, jak funkcji agregujących SQL.
Typ zwrotu | Podpis | Opis |
---|---|---|
BIGINT | count (*), count (wyr), | count (*) - zwraca całkowitą liczbę pobranych wierszy. |
PODWÓJNIE | suma (kolumna), suma (DISTINCT kolumna) | Zwraca sumę elementów w grupie lub sumę odrębnych wartości kolumny w grupie. |
PODWÓJNIE | śr. (kol.), śr. (kol. DISTINCT) | Zwraca średnią elementów w grupie lub średnią odrębnych wartości kolumny w grupie. |
PODWÓJNIE | min (kol) | Zwraca minimalną wartość kolumny w grupie. |
PODWÓJNIE | max (kol) | Zwraca maksymalną wartość kolumny w grupie. |
W tym rozdziale opisano sposób tworzenia widoków i zarządzania nimi. Widoki są generowane na podstawie wymagań użytkownika. Dowolne dane zestawu wyników można zapisać jako widok. Użycie widoku w gałęzi Hive jest takie samo jak w przypadku widoku w języku SQL. Jest to standardowa koncepcja RDBMS. Możemy wykonywać wszystkie operacje DML na widoku.
Tworzenie widoku
Możesz utworzyć widok w czasie wykonywania instrukcji SELECT. Składnia jest następująca:
CREATE VIEW [IF NOT EXISTS] view_name [(column_name [COMMENT column_comment], ...) ]
[COMMENT table_comment]
AS SELECT ...
Przykład
Weźmy przykład. Przyjmij tabelę pracowników, jak podano poniżej, z polami Id, Nazwisko, Wynagrodzenie, Stanowisko i Dział. Wygeneruj zapytanie, aby pobrać dane pracownika, którzy zarabiają więcej niż 30000 Rs. Wynik przechowujemy w widoku o nazwieemp_30000.
+------+--------------+-------------+-------------------+--------+
| ID | Name | Salary | Designation | Dept |
+------+--------------+-------------+-------------------+--------+
|1201 | Gopal | 45000 | Technical manager | TP |
|1202 | Manisha | 45000 | Proofreader | PR |
|1203 | Masthanvali | 40000 | Technical writer | TP |
|1204 | Krian | 40000 | Hr Admin | HR |
|1205 | Kranthi | 30000 | Op Admin | Admin |
+------+--------------+-------------+-------------------+--------+
Następujące zapytanie pobiera dane pracownika przy użyciu powyższego scenariusza:
hive> CREATE VIEW emp_30000 AS
> SELECT * FROM employee
> WHERE salary>30000;
Upuszczanie widoku
Użyj następującej składni, aby usunąć widok:
DROP VIEW view_name
Następujące zapytanie usuwa widok o nazwie emp_30000:
hive> DROP VIEW emp_30000;
Tworzenie indeksu
Indeks to nic innego jak wskaźnik na określoną kolumnę tabeli. Utworzenie indeksu oznacza utworzenie wskaźnika na konkretną kolumnę tabeli. Jego składnia jest następująca:
CREATE INDEX index_name
ON TABLE base_table_name (col_name, ...)
AS 'index.handler.class.name'
[WITH DEFERRED REBUILD]
[IDXPROPERTIES (property_name=property_value, ...)]
[IN TABLE index_table_name]
[PARTITIONED BY (col_name, ...)]
[
[ ROW FORMAT ...] STORED AS ...
| STORED BY ...
]
[LOCATION hdfs_path]
[TBLPROPERTIES (...)]
Przykład
Weźmy przykład index. Użyj tej samej tabeli pracowników, której używaliśmy wcześniej z polami Id, Imię i Nazwisko, Wynagrodzenie, Oznaczenie i Dział. Utwórz indeks o nazwie index_salary w kolumnie wynagrodzenia tabeli pracownika.
Następujące zapytanie tworzy indeks:
hive> CREATE INDEX inedx_salary ON TABLE employee(salary)
> AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler';
Jest to wskaźnik do kolumny wynagrodzenia. Jeśli kolumna zostanie zmodyfikowana, zmiany są zapisywane przy użyciu wartości indeksu.
Upuszczanie indeksu
Następująca składnia służy do usuwania indeksu:
DROP INDEX <index_name> ON <table_name>
Następujące zapytanie usuwa indeks o nazwie index_salary:
hive> DROP INDEX index_salary ON employee;