Hadoop學習(7)-hive的安裝和命令行使用和java操作

来源:https://www.cnblogs.com/wpbing/archive/2019/08/07/11313304.html
-Advertisement-
Play Games

Hive的用處,就是把hdfs里的文件建立映射轉化成資料庫的表 但hive里的sql語句都是轉化成了mapruduce來對hdfs里的數據進行處理 ,並不是真正的在資料庫里進行了操作。 而那些表的定義則是儲存在了mysql資料庫中,他只是記錄相應表的定義 所以你的集群中要有一臺機器裝了mysql 裝 ...


Hive的用處,就是把hdfs里的文件建立映射轉化成資料庫的表

 

但hive里的sql語句都是轉化成了mapruduce來對hdfs里的數據進行處理

,並不是真正的在資料庫里進行了操作。

而那些表的定義則是儲存在了mysql資料庫中,他只是記錄相應表的定義

所以你的集群中要有一臺機器裝了mysql

裝hive,裝到哪都行

然後解壓tar –zxvf xxxxx –C apps

然後進入到這個目錄里下的conf里

創建hive-site.xml文件

告訴他mysql在哪,連接驅動是啥,用戶名和密碼

然後進入lib目錄下,把jdbc jar 包放到該目錄下

 

然後是啟動hive

你的hadoop和hive要配置的有環境變數

 echo $PATH   //可以查看配置的環境變數

echo $HADOOP-HOME //可以查看具體的哪一個

然後最好把hadoop和yarn都啟動起來

然後再安裝目錄里bin/hive就可以啟動了

 

預設的是default資料庫

創建資料庫和表都會在真正的hdfs裡面創建目錄

 

 

 然後如果你要是想往表裡面導數據,你需要把相應的文件用 ^A 來分割放到hdfs里的相應目錄下

 

 

 

然後把這個文件上傳到hdfs裡面

  hadoop fs  -put stu.info /user/hive/warehouse/t_big24/

 

在hive交互頁面中,顯示當前庫

 

設置一些基本參數,讓hive使用起來更便捷,比如:

1、讓提示符顯示當前庫:

hive>set hive.cli.print.current.db=true;

2、顯示查詢結果時顯示欄位名稱:

hive>set hive.cli.print.header=true;

 

但是這樣設置只對當前會話有效,重啟hive會話後就失效,解決辦法:

在linux的當前用戶目錄中,編輯一個.hiverc文件,將參數寫入其中:

vi .hiverc

set hive.cli.print.header=true;

set hive.cli.print.current.db=true;

 

配置hive環境變數

比如我hive是解壓在  /root/apps/hive-1.2.1

Vi /etc/profile

然後在最後加上

Export HIVE_HOME=/root/apps/hive-1.2.1

Export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin

 

還可以把hive當成一個服務,使用客戶端來訪問這個服務

服務埠號10000

啟動hive服務

 bin/hiveserver2

然後可以在linux監聽埠號netstat -nltp

 

啟動成功後,可以在別的節點上用beeline去連接

啟動服務  bin/beeline

然後要連接他

!connect jdbc:hive2://hdp-01:10000

然後輸入賬戶root  沒有密碼

 

課外知識  標準輸出重定向。Linux里1就是標準輸出

./linux腳本文件 1>/要輸入的文件名 2>/錯誤時要定向到的文件名 &

這樣就不會再終端列印了

/dev/null  是一個“黑洞”什麼東西都會刪除

 

上述啟動,會將這個服務啟動在前臺,如果要啟動在後臺,則命令如下:

nohup bin/hiveserver2 1>/dev/null 2>&1 &

前面加上nohup就是就算這個用戶退出,這個進程也會繼續

 

 

hive -e "sql命令"

 

這樣可以不用進到hive直接運行

 

然後,進一步,可以將上述命令寫入shell腳本中,以便於腳本化運行hive任務,並控制、調度眾多hive任務,示例如下:

vi t_order_etl.sh

#!/bin/bash

hive -e "select * from db_order.t_order"

hive -e "select * from default.t_user"

hql="create table  default.t_bash as select * from db_order.t_order"

hive -e "$hql"

 

如果要執行的hql語句特別複雜,那麼,可以把hql語句寫入一個文件:

vi x.hql

select * from db_order.t_order;

select count(1) from db_order.t_user;

 

然後,用hive -f /root/x.hql 來執行

 

 

 

use db_order;

create table t_order(id string,create_time string,amount float,uid string);

表建好後,會在所屬的庫目錄中生成一個表目錄

/user/hive/warehouse/db_order.db/t_order

只是,這樣建表的話,hive會認為表數據文件中的欄位分隔符為 ^A

 

正確的建表語句為:

create table t_order(id string,create_time string,amount float,uid string)

row format delimited

fields terminated by ',';

 

這樣就指定了,我們的表數據文件中的欄位分隔符為 ","

 

內部表(MANAGED_TABLE):表目錄按照hive的規範來部署,位於hive的倉庫目錄/user/hive/warehouse中

 

外部表(EXTERNAL_TABLE):表目錄由建表用戶自己指定

create external table t_access(ip string,url string,access_time string)

row format delimited

fields terminated by ','

location '/access/log';

外部表和內部表的特性差別:

1、內部表的目錄在hive的倉庫目錄中 VS 外部表的目錄由用戶指定

2、drop一個內部表時:hive會清除相關元數據,並刪除表數據目錄

3、drop一個外部表時:hive只會清除相關元數據;

 

分區表的實質是:在表目錄中為數據文件創建分區子目錄,以便於在查詢時,MR程式可以針對分區子目錄中的數據進行處理,縮減讀取數據的範圍。

 

比如,網站每天產生的瀏覽記錄,瀏覽記錄應該建一個表來存放,但是,有時候,我們可能只需要對某一天的瀏覽記錄進行分析

 

1、創建帶分區的表

create table t_access(ip string,url string,access_time string)

partitioned by(dt string)

row format delimited

fields terminated by ',';

註意:分區欄位不能是表定義中的已存在欄位

 

 

向分區中導入數據

load data local inpath '/root/access.log.2017-08-04.log' into table t_access partition(dt='20170804');

load data local inpath '/root/access.log.2017-08-05.log' into table t_access partition(dt='20170805');

 

針對分區數據進行查詢

統計8月4號的總PV

select count(*) from t_access where dt='20170804';

實質:就是將分區欄位當成表欄位來用,就可以使用where子句指定分區了

 

 

建表:

create table t_partition(id int,name string,age int)

partitioned by(department string,sex string,howold int)

row format delimited fields terminated by ',';

 

導數據:

load data local inpath '/root/p1.dat' into table t_partition partition(department='xiangsheng',sex='male',howold=20);

 

可以通過已存在表來建表:

1、create table t_user_2 like t_user;

新建的t_user_2表結構定義與源表t_user一致,但是沒有數據

 

2、在建表的同時插入數據

create table t_access_user

as

select ip,url from t_access;

t_access_user會根據select查詢的欄位來建表,同時將查詢的結果插入新表中

 

1.1.1.   將hive表中的數據導出到指定路徑的文件

1、將hive表中的數據導入HDFS的文件

insert overwrite directory '/root/access-data'

row format delimited fields terminated by ','

select * from t_access;

 

 

2、將hive表中的數據導入本地磁碟文件

insert overwrite local directory '/root/access-data'

row format delimited fields terminated by ','

select * from t_access limit 100000;

 

hql裡面的數據類型和普通的沒什麼區別

 array數組類型

arrays: ARRAY<data_type> (Note: negative values and non-constant expressions are allowed as of Hive 0.14.)

 

示例:array類型的應用

假如有如下數據需要用hive的表去映射:

戰狼2,吳京:吳剛:龍母,2017-08-16

三生三世十里桃花,劉亦菲:癢癢,2017-08-20

設想:如果主演信息用一個數組來映射比較方便

 

 

建表:

create table t_movie(moive_name string,actors array<string>,first_show date)

row format delimited fields terminated by ','

collection items terminated by ':';

 

導入數據:

load data local inpath '/root/movie.dat' into table t_movie;

 

查詢:

select * from t_movie;

select moive_name,actors[0] from t_movie;

select moive_name,actors from t_movie where array_contains(actors,'吳剛');

select moive_name,size(actors) from t_movie;

 

map類型

1)         假如有以下數據:

1,zhangsan,father:xiaoming#mother:xiaohuang#brother:xiaoxu,28

2,lisi,father:mayun#mother:huangyi#brother:guanyu,22

3,wangwu,father:wangjianlin#mother:ruhua#sister:jingtian,29

4,mayun,father:mayongzhen#mother:angelababy,26

 

可以用一個map類型來對上述數據中的家庭成員進行描述

 

2)         建表語句:

create table t_person(id int,name string,family_members map<string,string>,age int)

row format delimited fields terminated by ','

collection items terminated by '#'

map keys terminated by ':';

 

3)         查詢

select * from t_person;

 

## 取map欄位的指定key的值

select id,name,family_members['father'] as father from t_person;

 

## 取map欄位的所有key

select id,name,map_keys(family_members) as relation from t_person;

 

## 取map欄位的所有value

select id,name,map_values(family_members) from t_person;

select id,name,map_values(family_members)[0] from t_person;

 

## 綜合:查詢有brother的用戶信息

select id,name,father

from

(select id,name,family_members['brother'] as father from t_person) tmp

where father is not null;

struct類型

1)         假如有如下數據:

1,zhangsan,18:male:beijing

2,lisi,28:female:shanghai

 

其中的用戶信息包含:年齡:整數,性別:字元串,地址:字元串

設想用一個欄位來描述整個用戶信息,可以採用struct

 

2)         建表:

create table t_person_struct(id int,name string,info struct<age:int,sex:string,addr:string>)

row format delimited fields terminated by ','

collection items terminated by ':';

 

3)         查詢

select * from t_person_struct;

select id,name,info.age from t_person_struct;

其他的執行語句和sql裡面的是基本一樣的

註意: 一旦有group by子句,那麼,在select子句中就不能有 (分組欄位,聚合函數) 以外的欄位

 

## 為什麼where必須寫在group by的前面,為什麼group by後面的條件只能用having

因為,where是用於在真正執行查詢邏輯之前過濾數據用的

having是對group by聚合之後的結果進行再過濾;

 

上述語句的執行邏輯:

1、where過濾不滿足條件的數據

2、用聚合函數和group by進行數據運算聚合,得到聚合結果

3、用having條件過濾掉聚合結果中不滿足條件的數據

 

 

假如有以下數據:

1,zhangsan,化學:物理:數學:語文

2,lisi,化學:數學:生物:生理:衛生

3,wangwu,化學:語文:英語:體育:生物

映射成一張表:

create table t_stu_subject(id int,name string,subjects array<string>)

row format delimited fields terminated by ','

collection items terminated by ':';

然後,我們利用這個explode的結果,來求去重的課程:

select distinct tmp.sub

from

(select explode(subjects) as sub from t_stu_subject) tmp;

 

 

然後java代碼操作的話,需要現在伺服器上開啟hive2服務,這個跟上面使用beeline連接hive是一個道理

 

 

 

需要的包在解壓後的hive裡面都有

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class getConnection {
 public getConnection() {
 }

 public static Connection getConnection() throws ClassNotFoundException, SQLException {
     Class.forName("org.apache.hive.jdbc.HiveDriver");
     Connection connection = DriverManager.getConnection("jdbc:hive2://hdp-02:10000/test","root","123456");
     
     return connection;
 }
}

這樣就可以獲得一個連接

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class getData {
    public getData() {
    }

    public static void getdata() throws ClassNotFoundException, SQLException {
        Connection connection = getConnection.getConnection();
        Statement statement = connection.createStatement();
        String sql = "select * from people";
        ResultSet res = statement.executeQuery(sql);while(res.next()) {
            System.out.println(res.getString(1) + "  " + res.getString(2) + "  " + res.getString(3) + "  " + res.getString(4));
        }

        res.close();
        statement.close();
        connection.close();
        return res;
        
    }
}

這個其實和連接普通的mysql也沒啥區別........

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 請耐心看完,特別是這兒學的亂的 一點點看底面的代碼分析你一定會懂的 rownum:是偽號的意思,Oracle專有,不屬於任何表,但是任何表都可以使用! 作用:用以給查詢出來的所有元組加上行號 規則:1,預設是從1開始,依次遞增。 2,不能去點rownum 3,rownum寫在哪個select中,這個 ...
  • 資料庫系統原理(一) 資料庫系統概述 1. 資料庫基本概念 什麼是數據? 數據(Data) 是描述事物的符號記錄,是指利用物理符號記錄下的、可以鑒別的信息 數據是信息存在的一種形式,只有通過解釋或處理的數據才能成為有用的信息 數據要按照一定的數據模型組織、描述和存儲,具有較小的冗餘度、較高的數據獨立 ...
  • 1.https://www.oracle.com/technetwork/java/javase/downloads/jdk12-downloads-5295953.html 在此頁面下載安裝JDK12,版本可能有更新 2.https://www.elastic.co/cn/downloads/pa ...
  • 清理歸檔日誌 ogg使用需要開啟歸檔日誌,歸檔日誌會隨著時間的推移逐漸增多,占滿空間,導致應用無法正常運行。 如果歸檔日誌滿了會報錯 檢查flash recovery area的使用情況 解決辦法:使用rman ,採用定時任務,定時清理。 定時任務腳本: OracleArchLogClear.bat ...
  • 一.標準hql建表語法格式1.官方標準語法:(hql不區分大小寫,下麵[]里的屬性是可選屬性) 具體參考官網界面:HIVE官網建表說明文檔 二.標準建表語法各項參數說明1.CREATE TABLE 創建一個指定名字的表。如果相同名字的表已經存在,則拋出異常;用戶可以用 IF NOT EXISTS 選 ...
  • Oracle 11g有基本安裝和高級安裝兩種方式。兩種方式對硬體要求也不相同,oracle11g軟體非常大,對硬體要求很高。目前只是講述在windows環境下的安裝,Linux環境下安裝以後會講,下表給出了安裝Oracle11g所需的硬體配置。 一、Windows環境下安裝 1、Oracle版本 分 ...
  • 提到SSH、Telnet等遠程終端登錄,我相信很多人想到的都是PuTTY PuTTY通常用於Windows,但實際上可以多平臺運行,因此不表達為“Windows下的遠程終端登錄” PuTTY足夠成熟、小巧、專註核心任務,並且對編碼等常見坑的處理並不缺乏,這其實都是優點。 但PuTTY在額外功能上就同 ...
  • 轉載:http://blog.sina.com.cn/s/blog_6dcd17320100tm6o.html 1. 對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。 2.應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...