Hive - Hướng dẫn nhanh
Thuật ngữ 'Dữ liệu lớn' được sử dụng cho các tập hợp các bộ dữ liệu lớn bao gồm khối lượng lớn, tốc độ cao và nhiều loại dữ liệu đang tăng lên từng ngày. Sử dụng các hệ thống quản lý dữ liệu truyền thống, rất khó để xử lý Dữ liệu lớn. Do đó, Apache Software Foundation đã giới thiệu một khuôn khổ gọi là Hadoop để giải quyết các thách thức về quản lý và xử lý Dữ liệu lớn.
Hadoop
Hadoop là một khuôn khổ mã nguồn mở để lưu trữ và xử lý Dữ liệu lớn trong môi trường phân tán. Nó chứa hai mô-đun, một là MapReduce và một là Hệ thống tệp phân tán Hadoop (HDFS).
MapReduce: Đây là một mô hình lập trình song song để xử lý một lượng lớn dữ liệu có cấu trúc, bán cấu trúc và phi cấu trúc trên các cụm phần cứng hàng hóa lớn.
HDFS:Hệ thống tệp phân tán Hadoop là một phần của khuôn khổ Hadoop, được sử dụng để lưu trữ và xử lý tập dữ liệu. Nó cung cấp một hệ thống tệp có khả năng chịu lỗi để chạy trên phần cứng hàng hóa.
Hệ sinh thái Hadoop chứa các dự án con (công cụ) khác nhau như Sqoop, Pig và Hive được sử dụng để trợ giúp các mô-đun Hadoop.
Sqoop: Nó được sử dụng để nhập và xuất dữ liệu qua lại giữa HDFS và RDBMS.
Pig: Nó là một nền tảng ngôn ngữ thủ tục được sử dụng để phát triển một tập lệnh cho các hoạt động MapReduce.
Hive: Nó là một nền tảng được sử dụng để phát triển các tập lệnh kiểu SQL để thực hiện các hoạt động MapReduce.
Note: Có nhiều cách khác nhau để thực hiện các hoạt động MapReduce:
- Cách tiếp cận truyền thống sử dụng chương trình Java MapReduce cho dữ liệu có cấu trúc, bán cấu trúc và phi cấu trúc.
- Phương pháp tiếp cận tập lệnh cho MapReduce để xử lý dữ liệu có cấu trúc và bán cấu trúc bằng Pig.
- Ngôn ngữ truy vấn Hive (HiveQL hoặc HQL) cho MapReduce để xử lý dữ liệu có cấu trúc bằng Hive.
Hive là gì
Hive là một công cụ cơ sở hạ tầng kho dữ liệu để xử lý dữ liệu có cấu trúc trong Hadoop. Nó nằm trên Hadoop để tóm tắt Dữ liệu lớn và giúp dễ dàng truy vấn và phân tích.
Ban đầu Hive được phát triển bởi Facebook, sau này Apache Software Foundation đã tiếp nhận và phát triển thêm dưới dạng mã nguồn mở với tên Apache Hive. Nó được sử dụng bởi các công ty khác nhau. Ví dụ: Amazon sử dụng nó trong Amazon Elastic MapReduce.
Hive không
- Cơ sở dữ liệu quan hệ
- Một thiết kế cho Xử lý Giao dịch Trực tuyến (OLTP)
- Một ngôn ngữ cho các truy vấn trong thời gian thực và cập nhật cấp hàng
Các tính năng của Hive
- Nó lưu trữ lược đồ trong cơ sở dữ liệu và dữ liệu được xử lý thành HDFS.
- Nó được thiết kế cho OLAP.
- Nó cung cấp ngôn ngữ kiểu SQL để truy vấn được gọi là HiveQL hoặc HQL.
- Nó quen thuộc, nhanh chóng, có thể mở rộng và mở rộng.
Kiến trúc của Hive
Sơ đồ thành phần sau đây mô tả kiến trúc của Hive:
Sơ đồ thành phần này chứa các đơn vị khác nhau. Bảng sau đây mô tả từng đơn vị:
Tên bài | Hoạt động |
---|---|
Giao diện người dùng | Hive là một phần mềm cơ sở hạ tầng kho dữ liệu có thể tạo ra sự tương tác giữa người dùng và HDFS. Các giao diện người dùng mà Hive hỗ trợ là Hive Web UI, dòng lệnh Hive và Hive HD Insight (Trong máy chủ Windows). |
Cửa hàng Meta | Hive chọn các máy chủ cơ sở dữ liệu tương ứng để lưu trữ lược đồ hoặc Siêu dữ liệu của bảng, cơ sở dữ liệu, cột trong bảng, kiểu dữ liệu của chúng và ánh xạ HDFS. |
Công cụ xử lý HiveQL | HiveQL tương tự như SQL để truy vấn thông tin lược đồ trên Metastore. Đây là một trong những phương pháp thay thế cách tiếp cận truyền thống cho chương trình MapReduce. Thay vì viết chương trình MapReduce bằng Java, chúng ta có thể viết một truy vấn cho công việc MapReduce và xử lý nó. |
Công cụ thực thi | Phần kết hợp của Công cụ quy trình HiveQL và MapReduce là Công cụ thực thi Hive. Công cụ thực thi xử lý truy vấn và tạo ra kết quả giống như kết quả MapReduce. Nó sử dụng hương vị của MapReduce. |
HDFS hoặc HBASE | Hệ thống tệp phân tán Hadoop hoặc HBASE là các kỹ thuật lưu trữ dữ liệu để lưu trữ dữ liệu vào hệ thống tệp. |
Làm việc của Hive
Sơ đồ sau mô tả quy trình làm việc giữa Hive và Hadoop.
Bảng sau đây xác định cách Hive tương tác với khuôn khổ Hadoop:
Bước không. | Hoạt động |
---|---|
1 | Execute Query Giao diện Hive như Dòng lệnh hoặc Giao diện người dùng Web gửi truy vấn đến Trình điều khiển (bất kỳ trình điều khiển cơ sở dữ liệu nào như JDBC, ODBC, v.v.) để thực thi. |
2 | Get Plan Trình điều khiển cần sự trợ giúp của trình biên dịch truy vấn phân tích cú pháp truy vấn để kiểm tra cú pháp và kế hoạch truy vấn hoặc yêu cầu của truy vấn. |
3 | Get Metadata Trình biên dịch gửi yêu cầu siêu dữ liệu đến Metastore (bất kỳ cơ sở dữ liệu nào). |
4 | Send Metadata Metastore gửi siêu dữ liệu dưới dạng phản hồi tới trình biên dịch. |
5 | Send Plan Trình biên dịch kiểm tra yêu cầu và gửi lại kế hoạch cho trình điều khiển. Đến đây, việc phân tích cú pháp và biên dịch truy vấn đã hoàn tất. |
6 | Execute Plan Trình điều khiển gửi kế hoạch thực thi đến động cơ thực thi. |
7 | Execute Job Trong nội bộ, quá trình thực thi công việc là một công việc MapReduce. Công cụ thực thi sẽ gửi công việc đến JobTracker, nằm trong nút Tên và nó chỉ định công việc này cho TaskTracker, nằm trong nút Dữ liệu. Tại đây, truy vấn thực hiện công việc MapReduce. |
7.1 | Metadata Ops Trong khi thực thi, công cụ thực thi có thể thực thi các hoạt động siêu dữ liệu với Metastore. |
số 8 | Fetch Result Công cụ thực thi nhận kết quả từ các nút Dữ liệu. |
9 | Send Results Công cụ thực thi gửi các giá trị kết quả đó đến trình điều khiển. |
10 | Send Results Trình điều khiển sẽ gửi kết quả đến Hive Interfaces. |
Tất cả các dự án con Hadoop như Hive, Pig và HBase đều hỗ trợ hệ điều hành Linux. Do đó, bạn cần phải cài đặt bất kỳ hệ điều hành có hương vị Linux nào. Các bước đơn giản sau được thực hiện để cài đặt Hive:
Bước 1: Xác minh cài đặt JAVA
Java phải được cài đặt trên hệ thống của bạn trước khi cài đặt Hive. Hãy để chúng tôi xác minh cài đặt java bằng lệnh sau:
$ java –version
Nếu Java đã được cài đặt trên hệ thống của bạn, bạn sẽ thấy phản hồi sau:
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)
Nếu java chưa được cài đặt trong hệ thống của bạn, hãy làm theo các bước dưới đây để cài đặt java.
Cài đặt Java
Bước I:
Tải xuống java (JDK <phiên bản mới nhất> - X64.tar.gz) bằng cách truy cập liên kết sau http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html.
Sau đó, jdk-7u71-linux-x64.tar.gz sẽ được tải xuống hệ thống của bạn.
Bước II:
Nói chung, bạn sẽ tìm thấy tệp java đã tải xuống trong thư mục Tải xuống. Xác minh nó và giải nén tệp jdk-7u71-linux-x64.gz bằng các lệnh sau.
$ 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
Bước III:
Để cung cấp java cho tất cả người dùng, bạn phải di chuyển nó đến vị trí “/ usr / local /”. Mở root và nhập các lệnh sau.
$ su
password:
# mv jdk1.7.0_71 /usr/local/
# exit
Bước IV:
Để thiết lập các biến PATH và JAVA_HOME, hãy thêm các lệnh sau vào tệp ~ / .bashrc.
export JAVA_HOME=/usr/local/jdk1.7.0_71
export PATH=PATH:$JAVA_HOME/bin
Bây giờ xác minh cài đặt bằng cách sử dụng lệnh java -version từ terminal như đã giải thích ở trên.
Bước 2: Xác minh cài đặt Hadoop
Hadoop phải được cài đặt trên hệ thống của bạn trước khi cài đặt Hive. Hãy để chúng tôi xác minh cài đặt Hadoop bằng lệnh sau:
$ hadoop version
Nếu Hadoop đã được cài đặt trên hệ thống của bạn, thì bạn sẽ nhận được phản hồi sau:
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
Nếu Hadoop chưa được cài đặt trên hệ thống của bạn, hãy tiến hành các bước sau:
Tải xuống Hadoop
Tải xuống và giải nén Hadoop 2.4.1 từ Apache Software Foundation bằng các lệnh sau.
$ 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
Cài đặt Hadoop trong Chế độ phân tán giả
Các bước sau được sử dụng để cài đặt Hadoop 2.4.1 ở chế độ phân tán giả.
Bước I: Thiết lập Hadoop
Bạn có thể đặt các biến môi trường Hadoop bằng cách thêm các lệnh sau vào ~/.bashrc tập tin.
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
Bây giờ áp dụng tất cả các thay đổi vào hệ thống đang chạy hiện tại.
$ source ~/.bashrc
Bước II: Cấu hình Hadoop
Bạn có thể tìm thấy tất cả các tệp cấu hình Hadoop ở vị trí “$ HADOOP_HOME / etc / hadoop”. Bạn cần thực hiện các thay đổi phù hợp trong các tệp cấu hình đó theo cơ sở hạ tầng Hadoop của mình.
$ cd $HADOOP_HOME/etc/hadoop
Để phát triển các chương trình Hadoop bằng java, bạn phải đặt lại các biến môi trường java trong hadoop-env.sh tập tin bằng cách thay thế JAVA_HOME giá trị với vị trí của java trong hệ thống của bạn.
export JAVA_HOME=/usr/local/jdk1.7.0_71
Dưới đây là danh sách các tệp mà bạn phải chỉnh sửa để định cấu hình Hadoop.
core-site.xml
Các core-site.xml tệp chứa thông tin như số cổng được sử dụng cho cá thể Hadoop, bộ nhớ được cấp cho hệ thống tệp, giới hạn bộ nhớ để lưu trữ dữ liệu và kích thước của bộ đệm Đọc / Ghi.
Mở core-site.xml và thêm các thuộc tính sau vào giữa các thẻ <configuration> và </configuration>.
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
hdfs-site.xml
Các hdfs-site.xmltệp chứa thông tin như giá trị của dữ liệu sao chép, đường dẫn nút tên và đường dẫn nút dữ liệu của hệ thống tệp cục bộ của bạn. Nó có nghĩa là nơi bạn muốn lưu trữ cơ sở hạ tầng Hadoop.
Hãy để chúng tôi giả sử dữ liệu sau đây.
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
Mở tệp này và thêm các thuộc tính sau vào giữa các thẻ <configuration>, </configuration> trong tệp này.
<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: Trong tệp ở trên, tất cả các giá trị thuộc tính do người dùng xác định và bạn có thể thực hiện các thay đổi theo cơ sở hạ tầng Hadoop của mình.
yarn-site.xml
Tệp này được sử dụng để cấu hình sợi thành Hadoop. Mở tệp fiber-site.xml và thêm các thuộc tính sau vào giữa các thẻ <configuration>, </configuration> trong tệp này.
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
mapred-site.xml
Tệp này được sử dụng để chỉ định khung MapReduce mà chúng tôi đang sử dụng. Theo mặc định, Hadoop chứa một mẫu sợi-site.xml. Trước hết, bạn cần sao chép tệp từ mapred-site, xml.template sang tệp mapred-site.xml bằng lệnh sau.
$ cp mapred-site.xml.template mapred-site.xml
Mở mapred-site.xml và thêm các thuộc tính sau vào giữa các thẻ <configuration>, </configuration> trong tệp này.
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
Xác minh cài đặt Hadoop
Các bước sau được sử dụng để xác minh cài đặt Hadoop.
Bước I: Đặt tên cho thiết lập nút
Thiết lập nút tên bằng lệnh “hdfs namenode -format” như sau.
$ cd ~ $ hdfs namenode -format
Kết quả mong đợi như sau.
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
************************************************************/
Bước II: Xác minh dfs Hadoop
Lệnh sau được sử dụng để bắt đầu dfs. Thực thi lệnh này sẽ khởi động hệ thống tệp Hadoop của bạn.
$ start-dfs.sh
Đầu ra dự kiến như sau:
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]
Bước III: Xác minh Tập lệnh Sợi
Lệnh sau được sử dụng để bắt đầu tập lệnh sợi. Việc thực thi lệnh này sẽ bắt đầu các daemon sợi của bạn.
$ start-yarn.sh
Đầu ra dự kiến như sau:
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
Bước IV: Truy cập Hadoop trên trình duyệt
Số cổng mặc định để truy cập Hadoop là 50070. Sử dụng url sau để tải các dịch vụ Hadoop trên trình duyệt của bạn.
http://localhost:50070/
Bước V: Xác minh tất cả các ứng dụng cho cụm
Số cổng mặc định để truy cập tất cả các ứng dụng của cụm là 8088. Sử dụng url sau để truy cập dịch vụ này.
http://localhost:8088/
Bước 3: Tải xuống Hive
Chúng tôi sử dụng hive-0.14.0 trong hướng dẫn này. Bạn có thể tải về bằng cách truy cập liên kết sauhttp://apache.petsads.us/hive/hive-0.14.0/.Giả sử nó được tải xuống thư mục / Downloads. Tại đây, chúng tôi tải xuống kho lưu trữ Hive có tên “apache-hive-0.14.0-bin.tar.gz” cho hướng dẫn này. Lệnh sau được sử dụng để xác minh tải xuống:
$ cd Downloads $ ls
Khi tải xuống thành công, bạn sẽ thấy phản hồi sau:
apache-hive-0.14.0-bin.tar.gz
Bước 4: Cài đặt Hive
Các bước sau là bắt buộc để cài đặt Hive trên hệ thống của bạn. Chúng tôi giả sử rằng kho lưu trữ Hive được tải xuống thư mục / Downloads.
Giải nén và xác minh Kho lưu trữ Hive
Lệnh sau được sử dụng để xác minh tải xuống và giải nén kho lưu trữ hive:
$ tar zxvf apache-hive-0.14.0-bin.tar.gz $ ls
Khi tải xuống thành công, bạn sẽ thấy phản hồi sau:
apache-hive-0.14.0-bin apache-hive-0.14.0-bin.tar.gz
Sao chép tệp vào thư mục / usr / local / hive
Chúng tôi cần sao chép các tệp từ siêu người dùng “su -”. Các lệnh sau được sử dụng để sao chép các tệp từ thư mục được giải nén vào thư mục / usr / local / hive ”.
$ su -
passwd:
# cd /home/user/Download
# mv apache-hive-0.14.0-bin /usr/local/hive
# exit
Thiết lập môi trường cho Hive
Bạn có thể thiết lập môi trường Hive bằng cách nối các dòng sau vào ~/.bashrc tập tin:
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/*:.
Lệnh sau được sử dụng để thực thi tệp ~ / .bashrc.
$ source ~/.bashrc
Bước 5: Định cấu hình Hive
Để định cấu hình Hive với Hadoop, bạn cần chỉnh sửa hive-env.sh tệp, được đặt trong $HIVE_HOME/confdanh mục. Các lệnh sau chuyển hướng đến Hiveconfig thư mục và sao chép tệp mẫu:
$ cd $HIVE_HOME/conf $ cp hive-env.sh.template hive-env.sh
Chỉnh sửa hive-env.sh tệp bằng cách nối thêm dòng sau:
export HADOOP_HOME=/usr/local/hadoop
Đã hoàn tất cài đặt Hive thành công. Bây giờ bạn yêu cầu một máy chủ cơ sở dữ liệu bên ngoài để cấu hình Metastore. Chúng tôi sử dụng cơ sở dữ liệu Apache Derby.
Bước 6: Tải xuống và cài đặt Apache Derby
Làm theo các bước dưới đây để tải xuống và cài đặt Apache Derby:
Tải xuống Apache Derby
Lệnh sau được sử dụng để tải xuống Apache Derby. Phải mất một thời gian để tải xuống.
$ cd ~ $ wget http://archive.apache.org/dist/db/derby/db-derby-10.4.2.0/db-derby-10.4.2.0-bin.tar.gz
Lệnh sau được sử dụng để xác minh tải xuống:
$ ls
Khi tải xuống thành công, bạn sẽ thấy phản hồi sau:
db-derby-10.4.2.0-bin.tar.gz
Giải nén và xác minh kho lưu trữ Derby
Các lệnh sau được sử dụng để giải nén và xác minh kho lưu trữ Derby:
$ tar zxvf db-derby-10.4.2.0-bin.tar.gz
$ ls
Khi tải xuống thành công, bạn sẽ thấy phản hồi sau:
db-derby-10.4.2.0-bin db-derby-10.4.2.0-bin.tar.gz
Sao chép tệp vào thư mục / usr / local / derby
Chúng ta cần sao chép từ siêu người dùng “su -”. Các lệnh sau được sử dụng để sao chép các tệp từ thư mục được giải nén vào thư mục / usr / local / derby:
$ su -
passwd:
# cd /home/user
# mv db-derby-10.4.2.0-bin /usr/local/derby
# exit
Thiết lập môi trường cho Derby
Bạn có thể thiết lập môi trường Derby bằng cách nối các dòng sau vào ~/.bashrc tập tin:
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
Lệnh sau được sử dụng để thực thi ~/.bashrc tập tin:
$ source ~/.bashrc
Tạo thư mục để lưu trữ Metastore
Tạo một thư mục có tên dữ liệu trong thư mục $ DERBY_HOME để lưu trữ dữ liệu Metastore.
$ mkdir $DERBY_HOME/data
Cài đặt Derby và thiết lập môi trường đã hoàn tất.
Bước 7: Định cấu hình kho lưu trữ của Hive
Cấu hình Metastore có nghĩa là chỉ định cho Hive nơi lưu trữ cơ sở dữ liệu. Bạn có thể thực hiện việc này bằng cách chỉnh sửa tệp hive-site.xml, nằm trong thư mục $ HIVE_HOME / conf. Trước hết, sao chép tệp mẫu bằng lệnh sau:
$ cd $HIVE_HOME/conf
$ cp hive-default.xml.template hive-site.xml
Biên tập hive-site.xml và nối các dòng sau giữa các thẻ <configuration> và </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>
Tạo một tệp có tên jpox.properties và thêm các dòng sau vào đó:
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
Bước 8: Xác minh cài đặt Hive
Trước khi chạy Hive, bạn cần tạo /tmpvà một thư mục Hive riêng biệt trong HDFS. Ở đây, chúng tôi sử dụng/user/hive/warehousethư mục. Bạn cần đặt quyền ghi cho các thư mục mới tạo này như hình dưới đây:
chmod g+w
Bây giờ hãy đặt chúng ở HDFS trước khi xác minh Hive. Sử dụng các lệnh sau:
$ $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
Các lệnh sau được sử dụng để xác minh cài đặt Hive:
$ cd $HIVE_HOME $ bin/hive
Khi cài đặt thành công Hive, bạn sẽ thấy phản hồi sau:
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>
Lệnh mẫu sau được thực thi để hiển thị tất cả các bảng:
hive> show tables;
OK
Time taken: 2.798 seconds
hive>
Chương này sẽ đưa bạn qua các kiểu dữ liệu khác nhau trong Hive, có liên quan đến việc tạo bảng. Tất cả các loại dữ liệu trong Hive được phân loại thành bốn loại, cụ thể như sau:
- Các loại cột
- Literals
- Giá trị rỗng
- Loại phức tạp
Các loại cột
Kiểu cột được sử dụng làm kiểu dữ liệu cột của Hive. Chúng như sau:
Các loại tích phân
Dữ liệu kiểu số nguyên có thể được chỉ định bằng cách sử dụng kiểu dữ liệu tích phân, INT. Khi phạm vi dữ liệu vượt quá phạm vi INT, bạn cần sử dụng BIGINT và nếu phạm vi dữ liệu nhỏ hơn INT, bạn sử dụng SMALLINT. TINYINT nhỏ hơn SMALLINT.
Bảng sau mô tả các kiểu dữ liệu INT khác nhau:
Kiểu | Postfix | Thí dụ |
---|---|---|
TINYINT | Y | 10 năm |
SMALLINT | S | 10S |
INT | - | 10 |
BIGINT | L | 10L |
Các loại chuỗi
Kiểu dữ liệu kiểu chuỗi có thể được chỉ định bằng cách sử dụng dấu nháy đơn ('') hoặc dấu nháy kép (""). Nó chứa hai kiểu dữ liệu: VARCHAR và CHAR. Hive đi theo các ký tự thoát C.
Bảng sau mô tả các kiểu dữ liệu CHAR khác nhau:
Loại dữ liệu | Chiều dài |
---|---|
VARCHAR | 1 đến 65355 |
CHAR | 255 |
Dấu thời gian
Nó hỗ trợ dấu thời gian UNIX truyền thống với độ chính xác nano giây tùy chọn. Nó hỗ trợ định dạng java.sql.Timestamp “YYYY-MM-DD HH: MM: SS.fffffffff” và định dạng “yyyy-mm-dd hh: mm: ss.ffffffffff”.
ngày
Giá trị DATE được mô tả theo định dạng năm / tháng / ngày trong biểu mẫu {{YYYY-MM-DD}}.
Số thập phân
Kiểu DECIMAL trong Hive cũng giống như định dạng Big Decimal của Java. Nó được sử dụng để biểu diễn độ chính xác tùy ý bất biến. Cú pháp và ví dụ như sau:
DECIMAL(precision, scale)
decimal(10,0)
Các loại liên minh
Union là tập hợp các kiểu dữ liệu không đồng nhất. Bạn có thể tạo một phiên bản bằng cách sử dụngcreate union. Cú pháp và ví dụ như sau:
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}
Chữ viết
Các ký tự sau được sử dụng trong Hive:
Các loại dấu chấm động
Các loại dấu phẩy động không có gì khác ngoài các số có dấu thập phân. Nói chung, loại dữ liệu này bao gồm kiểu dữ liệu DOUBLE.
Loại thập phân
-308 308Giá trị rỗng
Các giá trị bị thiếu được biểu thị bằng giá trị đặc biệt NULL.
Loại phức tạp
Các kiểu dữ liệu phức tạp của Hive như sau:
Mảng
Mảng trong Hive được sử dụng giống như cách chúng được sử dụng trong Java.
Cú pháp: ARRAY <data_type>
Bản đồ
Bản đồ trong Hive tương tự như Bản đồ Java.
Cú pháp: MAP <kiểu_dung_dưỡng, kiểu_dữ liệu>
Cấu trúc
Các cấu trúc trong Hive tương tự như việc sử dụng dữ liệu phức tạp với nhận xét.
Cú pháp: STRUCT <col_name: data_type [COMMENT col_comment], ...>
Hive là một công nghệ cơ sở dữ liệu có thể xác định cơ sở dữ liệu và bảng để phân tích dữ liệu có cấu trúc. Chủ đề cho phân tích dữ liệu có cấu trúc là lưu trữ dữ liệu theo cách lập bảng và chuyển các truy vấn để phân tích nó. Chương này giải thích cách tạo cơ sở dữ liệu Hive. Hive chứa một cơ sở dữ liệu mặc định có têndefault.
Tạo Tuyên bố Cơ sở dữ liệu
Tạo cơ sở dữ liệu là một câu lệnh được sử dụng để tạo cơ sở dữ liệu trong Hive. Cơ sở dữ liệu trong Hive là mộtnamespacehoặc một tập hợp các bảng. Cácsyntax cho câu lệnh này như sau:
CREATE DATABASE|SCHEMA [IF NOT EXISTS] <database name>
Ở đây, IF NOT EXISTS là một mệnh đề tùy chọn, nó thông báo cho người dùng rằng một cơ sở dữ liệu có cùng tên đã tồn tại. Chúng ta có thể sử dụng SCHEMA thay cho DATABASE trong lệnh này. Truy vấn sau được thực thi để tạo cơ sở dữ liệu có tênuserdb:
hive> CREATE DATABASE [IF NOT EXISTS] userdb;
or
hive> CREATE SCHEMA userdb;
Truy vấn sau được sử dụng để xác minh danh sách cơ sở dữ liệu:
hive> SHOW DATABASES;
default
userdb
Chương trình JDBC
Chương trình JDBC để tạo cơ sở dữ liệu được đưa ra dưới đây.
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();
}
}
Lưu chương trình trong một tệp có tên HiveCreateDb.java. Các lệnh sau được sử dụng để biên dịch và thực thi chương trình này.
$ javac HiveCreateDb.java $ java HiveCreateDb
Đầu ra:
Database userdb created successfully.
Chương này mô tả cách thả cơ sở dữ liệu trong Hive. Việc sử dụng SCHEMA và DATABASE giống nhau.
Thả tuyên bố cơ sở dữ liệu
Drop Database là một câu lệnh loại bỏ tất cả các bảng và xóa cơ sở dữ liệu. Cú pháp của nó như sau:
DROP DATABASE StatementDROP (DATABASE|SCHEMA) [IF EXISTS] database_name
[RESTRICT|CASCADE];
Các truy vấn sau đây được sử dụng để thả cơ sở dữ liệu. Giả sử rằng tên cơ sở dữ liệu làuserdb.
hive> DROP DATABASE IF EXISTS userdb;
Truy vấn sau loại bỏ cơ sở dữ liệu bằng cách sử dụng CASCADE. Nó có nghĩa là bỏ các bảng tương ứng trước khi bỏ cơ sở dữ liệu.
hive> DROP DATABASE IF EXISTS userdb CASCADE;
Truy vấn sau loại bỏ cơ sở dữ liệu bằng cách sử dụng SCHEMA.
hive> DROP SCHEMA userdb;
Điều khoản này đã được thêm vào Hive 0.6.
Chương trình JDBC
Chương trình JDBC để thả cơ sở dữ liệu được đưa ra bên dưới.
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();
}
}
Lưu chương trình trong một tệp có tên HiveDropDb.java. Dưới đây là các lệnh để biên dịch và thực thi chương trình này.
$ javac HiveDropDb.java $ java HiveDropDb
Đầu ra:
Drop userdb database successful.
Chương này giải thích cách tạo bảng và cách chèn dữ liệu vào đó. Các quy ước tạo bảng trong HIVE khá giống với tạo bảng bằng SQL.
Tạo Báo cáo Bảng
Create Table là một câu lệnh dùng để tạo bảng trong Hive. Cú pháp và ví dụ như sau:
Cú pháp
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]
Thí dụ
Giả sử bạn cần tạo một bảng có tên employee sử dụng CREATE TABLEtuyên bố. Bảng sau liệt kê các trường và kiểu dữ liệu của chúng trong bảng nhân viên:
Sr.No | Tên trường | Loại dữ liệu |
---|---|---|
1 | Eid | int |
2 | Tên | Chuỗi |
3 | Tiền lương | Phao nổi |
4 | Chỉ định | chuỗi |
Dữ liệu sau đây là một Nhận xét, các trường được định dạng theo hàng chẳng hạn như trường kết thúc trường, phần cuối dòng và loại tệp được lưu trữ.
COMMENT ‘Employee details’
FIELDS TERMINATED BY ‘\t’
LINES TERMINATED BY ‘\n’
STORED IN TEXT FILE
Truy vấn sau tạo một bảng có tên employee sử dụng dữ liệu trên.
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;
Nếu bạn thêm tùy chọn NẾU KHÔNG TỒN TẠI, Hive sẽ bỏ qua câu lệnh trong trường hợp bảng đã tồn tại.
Khi tạo bảng thành công, bạn sẽ thấy phản hồi sau:
OK
Time taken: 5.905 seconds
hive>
Chương trình JDBC
Chương trình JDBC để tạo một bảng được đưa ra ví dụ.
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();
}
}
Lưu chương trình trong một tệp có tên HiveCreateDb.java. Các lệnh sau được sử dụng để biên dịch và thực thi chương trình này.
$ javac HiveCreateDb.java $ java HiveCreateDb
Đầu ra
Table employee created.
Tải báo cáo dữ liệu
Nói chung, sau khi tạo bảng trong SQL, chúng ta có thể chèn dữ liệu bằng câu lệnh Insert. Nhưng trong Hive, chúng ta có thể chèn dữ liệu bằng câu lệnh LOAD DATA.
Trong khi chèn dữ liệu vào Hive, tốt hơn nên sử dụng TẢI DỮ LIỆU để lưu trữ các bản ghi hàng loạt. Có hai cách để tải dữ liệu: một là từ hệ thống tệp cục bộ và thứ hai là từ hệ thống tệp Hadoop.
Syntex
Cú pháp tải dữ liệu như sau:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename
[PARTITION (partcol1=val1, partcol2=val2 ...)]
- LOCAL là định danh để chỉ định đường dẫn cục bộ. Nó là tùy chọn.
- OVERWRITE là tùy chọn để ghi đè dữ liệu trong bảng.
- PARTITION là tùy chọn.
Thí dụ
Chúng tôi sẽ chèn dữ liệu sau vào bảng. Nó là một tệp văn bản có tênsample.txt trong /home/user danh mục.
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
Truy vấn sau tải văn bản đã cho vào bảng.
hive> LOAD DATA LOCAL INPATH '/home/user/sample.txt'
> OVERWRITE INTO TABLE employee;
Khi tải xuống thành công, bạn sẽ thấy phản hồi sau:
OK
Time taken: 15.905 seconds
hive>
Chương trình JDBC
Dưới đây là chương trình JDBC để tải dữ liệu đã cho vào bảng.
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();
}
}
Lưu chương trình trong một tệp có tên HiveLoadData.java. Sử dụng các lệnh sau để biên dịch và thực thi chương trình này.
$ javac HiveLoadData.java $ java HiveLoadData
Đầu ra:
Load Data into employee successful
Chương này giải thích cách thay đổi các thuộc tính của bảng như thay đổi tên bảng, thay đổi tên cột, thêm cột và xóa hoặc thay thế cột.
Tuyên bố bảng thay đổi
Nó được sử dụng để thay đổi một bảng trong Hive.
Cú pháp
Câu lệnh nhận bất kỳ cú pháp nào sau đây dựa trên những thuộc tính mà chúng ta muốn sửa đổi trong bảng.
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 ...])
Đổi tên thành… Tuyên bố
Truy vấn sau đổi tên bảng từ employee đến emp.
hive> ALTER TABLE employee RENAME TO emp;
Chương trình JDBC
Chương trình JDBC để đổi tên bảng như sau.
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();
}
}
Lưu chương trình trong một tệp có tên HiveAlterRenameTo.java. Sử dụng các lệnh sau để biên dịch và thực thi chương trình này.
$ javac HiveAlterRenameTo.java $ java HiveAlterRenameTo
Đầu ra:
Table renamed successfully.
Thay đổi Tuyên bố
Bảng sau chứa các trường employee bảng và nó hiển thị các trường cần thay đổi (in đậm).
Tên trường | Chuyển đổi từ Loại dữ liệu | Thay đổi tên trường | Chuyển đổi sang kiểu dữ liệu |
---|---|---|---|
eid | int | eid | int |
name | Chuỗi | ename | Chuỗi |
tiền lương | Float | tiền lương | Double |
sự chỉ định | Chuỗi | sự chỉ định | Chuỗi |
Các truy vấn sau đổi tên tên cột và kiểu dữ liệu cột bằng cách sử dụng dữ liệu trên:
hive> ALTER TABLE employee CHANGE name ename String;
hive> ALTER TABLE employee CHANGE salary salary Double;
Chương trình JDBC
Dưới đây là chương trình JDBC để thay đổi một cột.
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();
}
}
Lưu chương trình trong một tệp có tên HiveAlterChangeColumn.java. Sử dụng các lệnh sau để biên dịch và thực thi chương trình này.
$ javac HiveAlterChangeColumn.java $ java HiveAlterChangeColumn
Đầu ra:
Change column successful.
Thêm tuyên bố cột
Truy vấn sau đây thêm một cột có tên là dept vào bảng nhân viên.
hive> ALTER TABLE employee ADD COLUMNS (
> dept STRING COMMENT 'Department name');
Chương trình JDBC
Chương trình JDBC để thêm một cột vào bảng được đưa ra bên dưới.
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();
}
}
Lưu chương trình trong một tệp có tên HiveAlterAddColumn.java. Sử dụng các lệnh sau để biên dịch và thực thi chương trình này.
$ javac HiveAlterAddColumn.java $ java HiveAlterAddColumn
Đầu ra:
Add column successful.
Thay thế Tuyên bố
Truy vấn sau sẽ xóa tất cả các cột khỏi employee bảng và thay thế nó bằng emp và name cột:
hive> ALTER TABLE employee REPLACE COLUMNS (
> eid INT empid Int,
> ename STRING name String);
Chương trình JDBC
Dưới đây là chương trình JDBC để thay thế eid cột với empid và ename cột với 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();
}
}
Lưu chương trình trong một tệp có tên HiveAlterReplaceColumn.java. Sử dụng các lệnh sau để biên dịch và thực thi chương trình này.
$ javac HiveAlterReplaceColumn.java $ java HiveAlterReplaceColumn
Đầu ra:
Replace column successful.
Chương này mô tả cách thả một bảng trong Hive. Khi bạn thả một bảng khỏi Hive Metastore, nó sẽ xóa dữ liệu bảng / cột và siêu dữ liệu của chúng. Nó có thể là một bảng bình thường (được lưu trữ trong Metastore) hoặc một bảng bên ngoài (được lưu trữ trong hệ thống tệp cục bộ); Hive đối xử với cả hai theo cùng một cách, không phân biệt loại của chúng.
Tuyên bố bảng thả
Cú pháp như sau:
DROP TABLE [IF EXISTS] table_name;
Truy vấn sau đây đưa ra một bảng có tên employee:
hive> DROP TABLE IF EXISTS employee;
Khi thực hiện thành công truy vấn, bạn sẽ thấy phản hồi sau:
OK
Time taken: 5.3 seconds
hive>
Chương trình JDBC
Chương trình JDBC sau đây bỏ bảng nhân viên.
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();
}
}
Lưu chương trình trong một tệp có tên HiveDropTable.java. Sử dụng các lệnh sau để biên dịch và thực thi chương trình này.
$ javac HiveDropTable.java $ java HiveDropTable
Đầu ra:
Drop table successful
Truy vấn sau được sử dụng để xác minh danh sách các bảng:
hive> SHOW TABLES;
emp
ok
Time taken: 2.1 seconds
hive>
Hive tổ chức các bảng thành các phân vùng. Đây là cách chia bảng thành các phần liên quan dựa trên giá trị của các cột được phân vùng như ngày tháng, thành phố và phòng ban. Sử dụng phân vùng, có thể dễ dàng truy vấn một phần dữ liệu.
Bảng hoặc phân vùng được chia thành buckets,để cung cấp cấu trúc bổ sung cho dữ liệu có thể được sử dụng để truy vấn hiệu quả hơn. Bucketing hoạt động dựa trên giá trị của hàm băm của một số cột trong bảng.
Ví dụ, một bảng có tên Tab1chứa dữ liệu của nhân viên như id, tên, dept và yoj (tức là năm gia nhập). Giả sử bạn cần truy xuất thông tin chi tiết của tất cả nhân viên đã tham gia vào năm 2012. Một truy vấn tìm kiếm toàn bộ bảng cho thông tin cần thiết. Tuy nhiên, nếu bạn phân vùng dữ liệu nhân viên với năm và lưu trữ trong một tệp riêng, nó sẽ làm giảm thời gian xử lý truy vấn. Ví dụ sau đây cho thấy cách phân vùng tệp và dữ liệu của nó:
Tệp sau đây chứa bảng dữ liệu việc làm.
/ tab1 / Employeedata / file1
id, name, dept, yoj
1, gopal, TP, 2012
2, kiran, HR, 2012
3, cải xoăn, SC, 2013
4, Prasanth, SC, 2013
Dữ liệu trên được phân chia thành hai tệp sử dụng năm.
/ tab1 / Employeedata / 2012 / file2
1, gopal, TP, 2012
2, kiran, HR, 2012
/ tab1 / Employeedata / 2013 / file3
3, cải xoăn, SC, 2013
4, Prasanth, SC, 2013
Thêm phân vùng
Chúng ta có thể thêm phân vùng vào bảng bằng cách thay đổi bảng. Giả sử chúng ta có một bảng được gọi làemployee với các trường như Id, Tên, Lương, Chức vụ, Bộ phận và yoj.
Cú pháp:
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, ...)
Truy vấn sau được sử dụng để thêm phân vùng vào bảng nhân viên.
hive> ALTER TABLE employee
> ADD PARTITION (year=’2012’)
> location '/2012/part2012';
Đổi tên phân vùng
Cú pháp của lệnh này như sau.
ALTER TABLE table_name PARTITION partition_spec RENAME TO PARTITION partition_spec;
Truy vấn sau được sử dụng để đổi tên phân vùng:
hive> ALTER TABLE employee PARTITION (year=’1203’)
> RENAME TO PARTITION (Yoj=’1203’);
Bỏ phân vùng
Cú pháp sau được sử dụng để thả một phân vùng:
ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec, PARTITION partition_spec,...;
Truy vấn sau được sử dụng để thả phân vùng:
hive> ALTER TABLE employee DROP [IF EXISTS]
> PARTITION (year=’1203’);
Chương này giải thích các toán tử tích hợp của Hive. Có bốn loại toán tử trong Hive:
- Toán tử quan hệ
- Toán tử số học
- Toán tử logic
- Toán tử phức tạp
Toán tử quan hệ
Các toán tử này được sử dụng để so sánh hai toán hạng. Bảng sau đây mô tả các toán tử quan hệ có sẵn trong Hive:
Nhà điều hành | Toán hạng | Sự miêu tả |
---|---|---|
A = B | tất cả các loại nguyên thủy | TRUE nếu biểu thức A tương đương với biểu thức B nếu không FALSE. |
A! = B | tất cả các loại nguyên thủy | TRUE nếu biểu thức A không tương đương với biểu thức B, ngược lại là FALSE. |
A <B | tất cả các loại nguyên thủy | TRUE nếu biểu thức A nhỏ hơn biểu thức B nếu không FALSE. |
A <= B | tất cả các loại nguyên thủy | TRUE nếu biểu thức A nhỏ hơn hoặc bằng biểu thức B nếu không FALSE. |
A> B | tất cả các loại nguyên thủy | TRUE nếu biểu thức A lớn hơn biểu thức B nếu không FALSE. |
A> = B | tất cả các loại nguyên thủy | TRUE nếu biểu thức A lớn hơn hoặc bằng biểu thức B nếu không FALSE. |
A LÀ KHÔNG | các loại | TRUE nếu biểu thức A đánh giá là NULL, ngược lại là FALSE. |
A KHÔNG ĐẦY ĐỦ | các loại | FALSE nếu biểu thức A đánh giá là NULL, ngược lại là TRUE. |
A THÍCH B | Dây | TRUE nếu mẫu chuỗi A khớp với B, ngược lại là FALSE. |
A RLIKE B | Dây | NULL nếu A hoặc B là NULL, TRUE nếu bất kỳ chuỗi con nào của A khớp với biểu thức chính quy Java B, nếu không thì FALSE. |
A REGEXP B | Dây | Giống như RLIKE. |
Thí dụ
Hãy để chúng tôi giả sử employeebảng bao gồm các trường có tên Id, Tên, Mức lương, Chức vụ và Phòng ban như hình dưới đây. Tạo truy vấn để truy xuất chi tiết nhân viên có Id là 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|
+-----+--------------+--------+---------------------------+------+
Truy vấn sau được thực hiện để truy xuất thông tin chi tiết về nhân viên bằng bảng trên:
hive> SELECT * FROM employee WHERE Id=1205;
Khi thực hiện thành công truy vấn, bạn sẽ thấy phản hồi sau:
+-----+-----------+-----------+----------------------------------+
| ID | Name | Salary | Designation | Dept |
+-----+---------------+-------+----------------------------------+
|1205 | Kranthi | 30000 | Op Admin | Admin |
+-----+-----------+-----------+----------------------------------+
Truy vấn sau được thực hiện để truy xuất chi tiết nhân viên có mức lương cao hơn hoặc bằng 40000 Rs.
hive> SELECT * FROM employee WHERE Salary>=40000;
Khi thực hiện thành công truy vấn, bạn sẽ thấy phản hồi sau:
+-----+------------+--------+----------------------------+------+
| 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 |
+-----+------------+--------+----------------------------+------+
Toán tử số học
Các toán tử này hỗ trợ các phép toán số học phổ biến khác nhau trên các toán hạng. Tất cả chúng đều trả về các loại số. Bảng sau mô tả các toán tử số học có sẵn trong Hive:
Các nhà khai thác | Toán hạng | Sự miêu tả |
---|---|---|
A + B | tất cả các loại số | Cho kết quả của việc thêm A và B. |
A - B | tất cả các loại số | Cho kết quả của phép trừ B cho A. |
A * B | tất cả các loại số | Cho kết quả của phép nhân A và B. |
A / B | tất cả các loại số | Cho kết quả của phép chia B từ A. |
A% B | tất cả các loại số | Đưa ra lời nhắc do chia A cho B. |
A & B | tất cả các loại số | Cho kết quả của bitwise AND của A và B. |
A | B | tất cả các loại số | Cho kết quả OR bitwise của A và B. |
A ^ B | tất cả các loại số | Cho kết quả XOR theo từng bit của A và B. |
~ A | tất cả các loại số | Cung cấp kết quả của bitwise KHÔNG của A. |
Thí dụ
Truy vấn sau đây thêm hai số, 20 và 30.
hive> SELECT 20+30 ADD FROM temp;
Khi thực hiện thành công truy vấn, bạn sẽ thấy phản hồi sau:
+--------+
| ADD |
+--------+
| 50 |
+--------+
Toán tử logic
Các toán tử là các biểu thức logic. Tất cả chúng đều trả về TRUE hoặc FALSE.
Các nhà khai thác | Toán hạng | Sự miêu tả |
---|---|---|
A VÀ B | boolean | TRUE nếu cả A và B đều TRUE, ngược lại FALSE. |
A && B | boolean | Tương tự như A VÀ B. |
A HOẶC B | boolean | TRUE nếu A hoặc B hoặc cả hai là TRUE, nếu không FALSE. |
A || B | boolean | Giống như A HOẶC B. |
KHÔNG PHẢI | boolean | TRUE nếu A là FALSE, nếu không FALSE. |
! A | boolean | Giống như KHÔNG A. |
Thí dụ
Truy vấn sau được sử dụng để truy xuất thông tin chi tiết của nhân viên có Bộ phận là TP và Mức lương cao hơn 40000 Rs.
hive> SELECT * FROM employee WHERE Salary>40000 && Dept=TP;
Khi thực hiện thành công truy vấn, bạn sẽ thấy phản hồi sau:
+------+--------------+-------------+-------------------+--------+
| ID | Name | Salary | Designation | Dept |
+------+--------------+-------------+-------------------+--------+
|1201 | Gopal | 45000 | Technical manager | TP |
+------+--------------+-------------+-------------------+--------+
Toán tử phức tạp
Các toán tử này cung cấp một biểu thức để truy cập các phần tử của Loại phức hợp.
Nhà điều hành | Toán hạng | Sự miêu tả |
---|---|---|
A [n] | A là một mảng và n là một int | Nó trả về phần tử thứ n trong mảng A. Phần tử đầu tiên có chỉ số 0. |
M [phím] | M là một Bản đồ <K, V> và khóa có kiểu K | Nó trả về giá trị tương ứng với khóa trong bản đồ. |
Sx | S là một cấu trúc | Nó trả về trường x của S. |
Ngôn ngữ truy vấn Hive (HiveQL) là ngôn ngữ truy vấn để Hive xử lý và phân tích dữ liệu có cấu trúc trong Metastore. Chương này giải thích cách sử dụng câu lệnh SELECT với mệnh đề WHERE.
Câu lệnh SELECT được sử dụng để lấy dữ liệu từ bảng. Mệnh đề WHERE hoạt động tương tự như một điều kiện. Nó lọc dữ liệu bằng cách sử dụng điều kiện và cung cấp cho bạn một kết quả hữu hạn. Các toán tử và hàm tích hợp tạo ra một biểu thức đáp ứng điều kiện.
Cú pháp
Dưới đây là cú pháp của truy vấn 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];
Thí dụ
Hãy để chúng tôi lấy một ví dụ cho mệnh đề SELECT… WHERE. Giả sử chúng ta có bảng nhân viên như được đưa ra bên dưới, với các trường có tên Id, Tên, Lương, Chức vụ và Phòng ban Tạo truy vấn để truy xuất chi tiết nhân viên kiếm được mức lương hơn 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 |
+------+--------------+-------------+-------------------+--------+
Truy vấn sau truy xuất chi tiết nhân viên bằng cách sử dụng tình huống trên:
hive> SELECT * FROM employee WHERE salary>30000;
Khi thực hiện thành công truy vấn, bạn sẽ thấy phản hồi sau:
+------+--------------+-------------+-------------------+--------+
| 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 |
+------+--------------+-------------+-------------------+--------+
Chương trình JDBC
Chương trình JDBC áp dụng mệnh đề where cho ví dụ đã cho như sau.
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();
}
}
Lưu chương trình trong một tệp có tên HiveQLWhere.java. Sử dụng các lệnh sau để biên dịch và thực thi chương trình này.
$ javac HiveQLWhere.java $ java HiveQLWhere
Đầu ra:
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
Chương này giải thích cách sử dụng mệnh đề ORDER BY trong câu lệnh SELECT. Mệnh đề ORDER BY được sử dụng để lấy các chi tiết dựa trên một cột và sắp xếp kết quả được thiết lập theo thứ tự tăng dần hoặc giảm dần.
Cú pháp
Dưới đây là cú pháp của mệnh đề 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];
Thí dụ
Hãy để chúng tôi lấy một ví dụ cho mệnh đề SELECT ... ORDER BY. Giả sử bảng nhân viên như cho bên dưới, với các trường có tên Id, Tên, Lương, Chức vụ và Phòng ban Tạo truy vấn để truy xuất thông tin chi tiết về nhân viên theo thứ tự bằng cách sử dụng tên Phòng ban.
+------+--------------+-------------+-------------------+--------+
| 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 |
+------+--------------+-------------+-------------------+--------+
Truy vấn sau truy xuất chi tiết nhân viên bằng cách sử dụng tình huống trên:
hive> SELECT Id, Name, Dept FROM employee ORDER BY DEPT;
Khi thực hiện thành công truy vấn, bạn sẽ thấy phản hồi sau:
+------+--------------+-------------+-------------------+--------+
| 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 |
+------+--------------+-------------+-------------------+--------+
Chương trình JDBC
Đây là chương trình JDBC để áp dụng mệnh đề Order By cho ví dụ đã cho.
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();
}
}
Lưu chương trình trong một tệp có tên HiveQLOrderBy.java. Sử dụng các lệnh sau để biên dịch và thực thi chương trình này.
$ javac HiveQLOrderBy.java $ java HiveQLOrderBy
Đầu ra:
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
Chương này giải thích chi tiết về mệnh đề GROUP BY trong câu lệnh SELECT. Mệnh đề GROUP BY được sử dụng để nhóm tất cả các bản ghi trong một tập hợp kết quả bằng cách sử dụng một cột tập hợp cụ thể. Nó được sử dụng để truy vấn một nhóm bản ghi.
Cú pháp
Cú pháp của mệnh đề GROUP BY như sau:
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];
Thí dụ
Chúng ta hãy lấy một ví dụ về mệnh đề SELECT… GROUP BY. Giả sử bảng nhân viên như được cho bên dưới, với các trường Id, Tên, Lương, Chức vụ và Phòng. Tạo truy vấn để lấy số lượng nhân viên trong từng bộ phận.
+------+--------------+-------------+-------------------+--------+
| 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 |
+------+--------------+-------------+-------------------+--------+
Truy vấn sau đây truy xuất chi tiết nhân viên bằng cách sử dụng tình huống trên.
hive> SELECT Dept,count(*) FROM employee GROUP BY DEPT;
Khi thực hiện thành công truy vấn, bạn sẽ thấy phản hồi sau:
+------+--------------+
| Dept | Count(*) |
+------+--------------+
|Admin | 1 |
|PR | 2 |
|TP | 3 |
+------+--------------+
Chương trình JDBC
Dưới đây là chương trình JDBC để áp dụng mệnh đề Group By cho ví dụ đã cho.
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();
}
}
Lưu chương trình trong tệp có tên HiveQLGroupBy.java. Sử dụng các lệnh sau để biên dịch và thực thi chương trình này.
$ javac HiveQLGroupBy.java $ java HiveQLGroupBy
Đầu ra:
Dept Count(*)
Admin 1
PR 2
TP 3
JOINS là một mệnh đề được sử dụng để kết hợp các trường cụ thể từ hai bảng bằng cách sử dụng các giá trị chung cho mỗi bảng. Nó được sử dụng để kết hợp các bản ghi từ hai hoặc nhiều bảng trong cơ sở dữ liệu.
Cú pháp
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]
Thí dụ
Chúng ta sẽ sử dụng hai bảng sau trong chương này. Hãy xem xét bảng sau có tên 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 |
+----+----------+-----+-----------+----------+
Hãy xem xét một bảng ORDERS khác như sau:
+-----+---------------------+-------------+--------+
|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 |
+-----+---------------------+-------------+--------+
Có các kiểu nối khác nhau được đưa ra như sau:
- JOIN
- THAM GIA BÊN NGOÀI TRÁI
- THAM GIA ĐÚNG
- THAM GIA NGOÀI TRỜI ĐẦY ĐỦ
THAM GIA
Mệnh đề JOIN được sử dụng để kết hợp và truy xuất các bản ghi từ nhiều bảng. JOIN giống như OUTER JOIN trong SQL. Một điều kiện JOIN sẽ được đưa ra bằng cách sử dụng khóa chính và khóa ngoại của bảng.
Truy vấn sau đây thực thi JOIN trên các bảng CUSTOMER và ORDER, đồng thời truy xuất các bản ghi:
hive> SELECT c.ID, c.NAME, c.AGE, o.AMOUNT
> FROM CUSTOMERS c JOIN ORDERS o
> ON (c.ID = o.CUSTOMER_ID);
Khi thực hiện thành công truy vấn, bạn sẽ thấy phản hồi sau:
+----+----------+-----+--------+
| ID | NAME | AGE | AMOUNT |
+----+----------+-----+--------+
| 3 | kaushik | 23 | 3000 |
| 3 | kaushik | 23 | 1500 |
| 2 | Khilan | 25 | 1560 |
| 4 | Chaitali | 25 | 2060 |
+----+----------+-----+--------+
THAM GIA BÊN NGOÀI TRÁI
HiveQL LEFT OUTER JOIN trả về tất cả các hàng từ bảng bên trái, ngay cả khi không có hàng nào phù hợp trong bảng bên phải. Điều này có nghĩa là, nếu mệnh đề ON khớp với bản ghi 0 (không) trong bảng bên phải, thì JOIN vẫn trả về một hàng trong kết quả, nhưng với NULL trong mỗi cột từ bảng bên phải.
LEFT JOIN trả về tất cả các giá trị từ bảng bên trái, cộng với các giá trị được so khớp từ bảng bên phải hoặc NULL trong trường hợp không có vị từ JOIN phù hợp.
Truy vấn sau minh họa THAM GIA TRÁI OUTER giữa bảng CUSTOMER và 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);
Khi thực hiện thành công truy vấn, bạn sẽ thấy phản hồi sau:
+----+----------+--------+---------------------+
| 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 |
+----+----------+--------+---------------------+
THAM GIA ĐÚNG
HiveQL RIGHT OUTER JOIN trả về tất cả các hàng từ bảng bên phải, ngay cả khi không có hàng nào phù hợp trong bảng bên trái. Nếu mệnh đề ON khớp với bản ghi 0 (không) trong bảng bên trái, thì JOIN vẫn trả về một hàng trong kết quả, nhưng với NULL trong mỗi cột từ bảng bên trái.
RIGHT JOIN trả về tất cả các giá trị từ bảng bên phải, cộng với các giá trị đã so khớp từ bảng bên trái hoặc NULL trong trường hợp không có vị từ nối phù hợp.
Truy vấn sau đây thể hiện sự THAM GIA RIGHT OUTER giữa bảng CUSTOMER và 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);
Khi thực hiện thành công truy vấn, bạn sẽ thấy phản hồi sau:
+------+----------+--------+---------------------+
| 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 |
+------+----------+--------+---------------------+
THAM GIA NGOÀI TRỜI ĐẦY ĐỦ
HiveQL FULL OUTER JOIN kết hợp các bản ghi của cả bảng bên trái và bên phải đáp ứng điều kiện JOIN. Bảng đã kết hợp chứa tất cả các bản ghi từ cả hai bảng hoặc điền giá trị NULL cho các kết quả khớp bị thiếu ở một trong hai bên.
Truy vấn sau thể hiện FULL OUTER JOIN giữa bảng CUSTOMER và 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);
Khi thực hiện thành công truy vấn, bạn sẽ thấy phản hồi sau:
+------+----------+--------+---------------------+
| 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 |
+------+----------+--------+---------------------+
Chương này giải thích các chức năng tích hợp sẵn có trong Hive. Các hàm trông khá giống với các hàm SQL, ngoại trừ cách sử dụng của chúng.
Chức năng tích hợp sẵn
Hive hỗ trợ các chức năng tích hợp sau:
Loại trả lại | Chữ ký | Sự miêu tả |
---|---|---|
BIGINT | vòng (gấp đôi a) | Nó trả về giá trị BIGINT được làm tròn của đôi. |
BIGINT | tầng (đôi a) | Nó trả về giá trị BIGINT tối đa bằng hoặc nhỏ hơn giá trị gấp đôi. |
BIGINT | ceil (gấp đôi a) | Nó trả về giá trị BIGINT tối thiểu bằng hoặc lớn hơn giá trị gấp đôi. |
gấp đôi | rand (), rand (int seed) | Nó trả về một số ngẫu nhiên thay đổi từ hàng này sang hàng khác. |
chuỗi | concat (chuỗi A, chuỗi B, ...) | Nó trả về chuỗi kết quả từ việc nối B sau A. |
chuỗi | substr (chuỗi A, int start) | Nó trả về chuỗi con của A bắt đầu từ vị trí bắt đầu cho đến cuối chuỗi A. |
chuỗi | substr (chuỗi A, int start, int length) | Nó trả về chuỗi con của A bắt đầu từ vị trí bắt đầu với độ dài đã cho. |
chuỗi | trên (chuỗi A) | Nó trả về chuỗi kết quả từ việc chuyển đổi tất cả các ký tự của A thành chữ hoa. |
chuỗi | ucase (chuỗi A) | Giống như trên. |
chuỗi | thấp hơn (chuỗi A) | Nó trả về chuỗi kết quả từ việc chuyển đổi tất cả các ký tự của B thành chữ thường. |
chuỗi | lcase (chuỗi A) | Giống như trên. |
chuỗi | trim (chuỗi A) | Nó trả về chuỗi kết quả từ việc cắt bớt khoảng trắng từ cả hai đầu A. |
chuỗi | ltrim (chuỗi A) | Nó trả về chuỗi kết quả từ việc cắt bớt khoảng trắng từ đầu (phía bên tay trái) của A. |
chuỗi | rtrim (chuỗi A) | rtrim (chuỗi A) Nó trả về chuỗi kết quả từ việc cắt bớt khoảng trắng từ cuối (phía bên tay phải) của A. |
chuỗi | regexp_replace (chuỗi A, chuỗi B, chuỗi C) | Nó trả về chuỗi kết quả từ việc thay thế tất cả các chuỗi con trong B khớp với cú pháp của biểu thức chính quy Java với C. |
int | kích thước (Bản đồ <KV>) | Nó trả về số phần tử trong loại bản đồ. |
int | kích thước (Mảng <T>) | Nó trả về số phần tử trong kiểu mảng. |
giá trị của <type> | ép kiểu (<expr> as <type>) | Nó chuyển đổi kết quả của biểu thức expr thành <type>, ví dụ như ép kiểu ('1' là BIGINT) chuyển đổi chuỗi '1' thành biểu diễn tích phân. Một NULL được trả về nếu chuyển đổi không thành công. |
chuỗi | from_unixtime (int unixtime) | chuyển đổi số giây từ Unix epoch (1970-01-01 00:00:00 UTC) thành một chuỗi biểu thị dấu thời gian của thời điểm đó trong múi giờ hệ thống hiện tại ở định dạng "1970-01-01 00:00: 00 " |
chuỗi | to_date (dấu thời gian chuỗi) | Nó trả về phần ngày của chuỗi dấu thời gian: to_date ("1970-01-01 00:00:00") = "1970-01-01" |
int | năm (chuỗi ngày) | Nó trả về phần năm của ngày hoặc chuỗi dấu thời gian: year ("1970-01-01 00:00:00") = 1970, year ("1970-01-01") = 1970 |
int | tháng (chuỗi ngày) | Nó trả về phần tháng của ngày hoặc chuỗi dấu thời gian: month ("1970-11-01 00:00:00") = 11, month ("1970-11-01") = 11 |
int | ngày (chuỗi ngày) | Nó trả về phần ngày của ngày hoặc chuỗi dấu thời gian: day ("1970-11-01 00:00:00") = 1, day ("1970-11-01") = 1 |
chuỗi | get_json_object (chuỗi json_string, đường dẫn chuỗi) | Nó trích xuất đối tượng json từ một chuỗi json dựa trên đường dẫn json được chỉ định và trả về chuỗi json của đối tượng json được trích xuất. Nó trả về NULL nếu chuỗi json đầu vào không hợp lệ. |
Thí dụ
Các truy vấn sau thể hiện một số chức năng tích hợp sẵn:
hàm round ()
hive> SELECT round(2.6) from temp;
Khi thực hiện thành công truy vấn, bạn sẽ thấy phản hồi sau:
3.0
hàm tầng ()
hive> SELECT floor(2.6) from temp;
Khi thực hiện thành công truy vấn, bạn sẽ thấy phản hồi sau:
2.0
hàm ceil ()
hive> SELECT ceil(2.6) from temp;
Khi thực hiện thành công truy vấn, bạn sẽ thấy phản hồi sau:
3.0
Chức năng tổng hợp
Hive hỗ trợ tích hợp sau aggregate functions. Việc sử dụng các hàm này giống như các hàm tổng hợp trong SQL.
Loại trả lại | Chữ ký | Sự miêu tả |
---|---|---|
BIGINT | count (*), count (expr), | count (*) - Trả về tổng số hàng đã truy xuất. |
GẤP ĐÔI | sum (col), sum (DISTINCT col) | Nó trả về tổng các phần tử trong nhóm hoặc tổng các giá trị riêng biệt của cột trong nhóm. |
GẤP ĐÔI | trung bình (col), trung bình (DISTINCT col) | Nó trả về giá trị trung bình của các phần tử trong nhóm hoặc giá trị trung bình của các giá trị riêng biệt của cột trong nhóm. |
GẤP ĐÔI | min (col) | Nó trả về giá trị nhỏ nhất của cột trong nhóm. |
GẤP ĐÔI | max (col) | Nó trả về giá trị lớn nhất của cột trong nhóm. |
Chương này mô tả cách tạo và quản lý các khung nhìn. Lượt xem được tạo dựa trên yêu cầu của người dùng. Bạn có thể lưu bất kỳ dữ liệu tập hợp kết quả nào dưới dạng một dạng xem. Cách sử dụng chế độ xem trong Hive cũng giống như cách sử dụng chế độ xem trong SQL. Nó là một khái niệm RDBMS tiêu chuẩn. Chúng ta có thể thực thi tất cả các thao tác DML trên một khung nhìn.
Tạo chế độ xem
Bạn có thể tạo một dạng xem tại thời điểm thực hiện câu lệnh SELECT. Cú pháp như sau:
CREATE VIEW [IF NOT EXISTS] view_name [(column_name [COMMENT column_comment], ...) ]
[COMMENT table_comment]
AS SELECT ...
Thí dụ
Hãy để chúng tôi lấy một ví dụ để xem. Giả sử bảng nhân viên như được đưa ra bên dưới, với các trường Id, Tên, Lương, Chức vụ và Phòng ban Tạo truy vấn để truy xuất thông tin chi tiết về nhân viên kiếm được mức lương hơn 30000 Rs. Chúng tôi lưu trữ kết quả trong dạng xem có tênemp_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 |
+------+--------------+-------------+-------------------+--------+
Truy vấn sau truy xuất chi tiết nhân viên bằng cách sử dụng tình huống trên:
hive> CREATE VIEW emp_30000 AS
> SELECT * FROM employee
> WHERE salary>30000;
Bỏ chế độ xem
Sử dụng cú pháp sau để thả một lượt xem:
DROP VIEW view_name
Truy vấn sau đưa ra chế độ xem có tên là emp_30000:
hive> DROP VIEW emp_30000;
Tạo chỉ mục
Chỉ mục không là gì ngoài một con trỏ trên một cột cụ thể của bảng. Tạo chỉ mục có nghĩa là tạo một con trỏ trên một cột cụ thể của bảng. Cú pháp của nó như sau:
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 (...)]
Thí dụ
Hãy để chúng tôi lấy một ví dụ cho chỉ mục. Sử dụng cùng một bảng nhân viên mà chúng ta đã sử dụng trước đó với các trường Id, Tên, Lương, Chức vụ và Phòng ban Tạo một chỉ mục có tên là index_salary trên cột lương của bảng nhân viên.
Truy vấn sau tạo chỉ mục:
hive> CREATE INDEX inedx_salary ON TABLE employee(salary)
> AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler';
Nó là một con trỏ đến cột lương. Nếu cột được sửa đổi, các thay đổi được lưu trữ bằng giá trị chỉ mục.
Giảm chỉ số
Cú pháp sau được sử dụng để bỏ chỉ mục:
DROP INDEX <index_name> ON <table_name>
Truy vấn sau đây đưa ra một chỉ mục có tên là index_salary:
hive> DROP INDEX index_salary ON employee;