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 308

Giá 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 empname 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 empidename 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;