1. 程式人生 > >Hive_Hive查詢結果匯出的幾種方式

Hive_Hive查詢結果匯出的幾種方式

    我們經常利用Hive完成一些資料報表統計的需求,此時我們在特定場景中需要對Hive查詢的結果做匯出,

這樣就延伸出了幾種查詢結果匯出的方法,我們這裡做一下總結。

1.利用beeline 執行查詢,將輸出重定向的方式

2.利用insert overwrite 的方式,將查詢結果匯出hdfs或者本地

第一步我們看下主體的查詢語句:

use default;


SELECT media_info.media_name, media_tmp.* , activity_info.*, camp_media_tmp.*
FROM 
(
	SELECT
        	activity.id,
        	activity.activity_name,
       		advertiser.advertiser_name,
        	agency.agency_name
	FROM promotion_activity_mysql AS activity
	JOIN admin_advertiser_mysql AS advertiser ON activity.advertiser_id = advertiser.id
	JOIN admin_agency_mysql AS agency ON advertiser.agency_id = agency.id
) AS activity_info
JOIN 
(
	SELECT
        	mid.mediaid     ,
       		mid.campaignid  ,
       		SUM(mid.campimp) as camp_imp    ,
        	SUM(mid.campclick) as camp_click        ,
        	SUM(mid.campclickcost) as click_cost
	FROM
        	clickcube_mid AS  mid
	WHERE   mid.day >= '2018-06-01' AND mid.day <= '2018-06-30'
	GROUP BY  mid.mediaid, mid.campaignid
) AS camp_media_tmp ON activity_info.id = camp_media_tmp.campaignid 
JOIN
(
	SELECT
        	'2018-06'       ,
        	mid.mediaid     ,
        	SUM(mid.mediaimp) AS  media_imp_total   ,
        	SUM(mid.mediaclick) AS media_clk_total      ,
        	SUM(mid.mediaclickcost) AS media_cost
	FROM
        	clickcube_mid AS  mid
	WHERE   mid.day >= '2018-06-01' AND mid.day <= '2018-06-30'
	GROUP BY  mid.mediaid
) AS media_tmp ON  camp_media_tmp.mediaid = media_tmp.mediaid
JOIN 
admin_media_mysql AS media_info ON media_info.id = media_tmp.mediaid 
ORDER BY media_tmp.mediaid, camp_media_tmp.campaignid 
;

1.首先我們看下beeline執行查詢,檔案重定向的方式

缺點:該種將資料匯出的方式,其實跟在控制檯將查詢結果輸出並沒有什麼區別。

輸出會包含很多冗餘的資訊

首先我們需要對beeline 的引數較為了解:

傳送門:

Hive _ Hive2 新版連線工具 beeline 詳解

這裡我們需要注意一個問題,hive查詢預設不顯示錶頭的,我們需要開啟顯示錶頭的開關

我們將這個操作寫到 **.init 檔案中

final_to_hdfs_201806.init

SET hive.cli.print.header=true;

這裡我們就可以利用檔案中重定向了,我們將beeline 執行的過程寫到shell 指令碼中 .


final_to_file.sh

#!/bin/bash


beeline -u jdbc:hive2://10.180.0.26:10000 -n cloudera-scm -f final_to_file_201806_report.hql -i final_to_hdfs_201806.init > final_report_file.txt

看下最終執行的結果

[[email protected] 20180703_media_agency_job]$ head -n 10 final_report_file.txt 
0: jdbc:hive2://10.180.0.26:10000> 
0: jdbc:hive2://10.180.0.26:10000> SET hive.cli.print.header=true;
0: jdbc:hive2://10.180.0.26:10000> 
0: jdbc:hive2://10.180.0.26:10000> 
0: jdbc:hive2://10.180.0.26:10000> 
0: jdbc:hive2://10.180.0.26:10000> use default;
0: jdbc:hive2://10.180.0.26:10000> 
0: jdbc:hive2://10.180.0.26:10000> SELECT media_info.media_name, media_tmp.* , activity_info.*, camp_media_tmp.*
. . . . . . . . . . . . . . . . .> FROM 
. . . . . . . . . . . . . . . . .> (

2.利用insert overwrite 的方式,將查詢結果匯出hdfs或者本地

缺點: 該種方式並沒有資料表頭的資訊,需要手動增加表頭

首先我們看下對Hive 資料匯出語句 INSERT OVERWRITE 的介紹:

Standard syntax:
INSERT OVERWRITE [LOCAL] DIRECTORY directory1
  [ROW FORMAT row_format] [STORED AS file_format] (Note: Only available starting with Hive 0.11.0)
  SELECT ... FROM ...
 
Hive extension (multiple inserts):
FROM from_statement
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1
[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2] ...
 
  
row_format
  : DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
        [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
        [NULL DEFINED AS char] (Note: Only available starting with Hive 0.13)


可以該種方式的支援比較完善

首先匯出的資料格式是可選的:

[STORED AS file_format] (Note: Only available starting with Hive 0.11.0)

也就是說匯出的資料格式是可選的,到目前為止可選的資料檔案型別主要為以下幾種檔案:

file_format:  

  : SEQUENCEFILE  

    含有資料的元資訊,可分塊,資料按行組織起來

  | TEXTFILE  

    TEXTFILE 最原始的文字檔案

  | RCFILE     (Note: Only available starting with Hive 0.6.0)  

    資料按列組織起來

  | ORC        (Note: Only available starting with Hive 0.11.0)  

  | AVRO       (Note: Only available starting with Hive 0.14.0)  

  | INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname 

  | PARQUET

     資料按行組織起來

這裡我們存為textfile

示例:

STORED AS TEXTFILE

其次匯出的欄位分隔符是可以自己設定的,   

Hive 中欄位之間的分隔符預設是 ^A (ascii碼是\00001),

不便於修改檢視,我們將分隔符改為 , (逗號)

示例:

ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','

最後查詢的資料檔案的位置是可以指定的,可以存放在執行查詢的機器的本地磁碟上,也可以存放在hdfs上,這裡我們指定hdfs.

INSERT OVERWRITE [LOCAL] DIRECTORY directory1

示例:

INSERT OVERWRITE directory '/tmp/201806_report'

最終的查詢語句

use default;

INSERT OVERWRITE directory '/tmp/201806_report'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE
-- STORED AS SEQUENCEFILE
SELECT media_info.media_name, media_tmp.* , activity_info.*, camp_media_tmp.*
FROM 
(
	SELECT
        	activity.id,
        	activity.activity_name,
       		advertiser.advertiser_name,
        	agency.agency_name
	FROM promotion_activity_mysql AS activity
	JOIN admin_advertiser_mysql AS advertiser ON activity.advertiser_id = advertiser.id
	JOIN admin_agency_mysql AS agency ON advertiser.agency_id = agency.id
) AS activity_info
JOIN 
(
	SELECT
        	mid.mediaid     ,
       		mid.campaignid  ,
       		SUM(mid.campimp) as camp_imp    ,
        	SUM(mid.campclick) as camp_click        ,
        	SUM(mid.campclickcost) as click_cost
	FROM
        	clickcube_mid AS  mid
	WHERE   mid.day >= '2018-06-01' AND mid.day <= '2018-06-30'
	GROUP BY  mid.mediaid, mid.campaignid
) AS camp_media_tmp ON activity_info.id = camp_media_tmp.campaignid 
JOIN
(
	SELECT
        	'2018-06'       ,
        	mid.mediaid     ,
        	SUM(mid.mediaimp) AS  media_imp_total   ,
        	SUM(mid.mediaclick) AS media_clk_total      ,
        	SUM(mid.mediaclickcost) AS media_cost
	FROM
        	clickcube_mid AS  mid
	WHERE   mid.day >= '2018-06-01' AND mid.day <= '2018-06-30'
	GROUP BY  mid.mediaid
) AS media_tmp ON  camp_media_tmp.mediaid = media_tmp.mediaid
JOIN 
admin_media_mysql AS media_info ON media_info.id = media_tmp.mediaid 
ORDER BY media_tmp.mediaid, camp_media_tmp.campaignid 
;

我們將執行過程寫入指令碼中

#!/bin/bash


beeline -u jdbc:hive2://10.180.0.26:10000 -n cloudera-scm -f final_to_hdfs_201806_report.hql -i final_to_hdfs_201806.init 

最終的執行結果:


我們檢視下執行結果:


相關推薦

Hive_Hive查詢結果匯出方式

    我們經常利用Hive完成一些資料報表統計的需求,此時我們在特定場景中需要對Hive查詢的結果做匯出,這樣就延伸出了幾種查詢結果匯出的方法,我們這裡做一下總結。1.利用beeline 執行查詢,將輸出重定向的方式2.利用insert overwrite 的方式,將查詢結

Mysql查詢結果匯出為Excel的方法

本想直接轉發,奈何密碼忘記了。原文複製過來吧。 原文地址:https://www.cnblogs.com/qiaoyihang/p/6398673.html 【我使用的是方法二】 本文地址:http://www.cnblogs.com/qiaoyihang/p/6398

mybatis進行模糊查詢方式

單個 ase nco ash face myba select from rda mapper文件: <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org

SQL分頁查詢方式

但是 order 結果 htm sql分頁 sele esc 註意 介紹 https://www.cnblogs.com/lxhbky/p/5962393.html 需求:查詢表dbo.Message,每頁10條,查詢第2頁 1:TOP() SELECT TOP(2

Hibernate的條件查詢方式+查詢所有的記錄

數據庫 rop query 寫法 OS 由於 AC 對象 tst 1、 第一種,用?占位符,如: //登錄(用?占位符) public List<UserPO> LoginUser(UserPO up)throws Exception{ Session

SQL 的模糊查詢方式

tween SQ 列名 HERE like BE between 指定 模糊查詢 1、使用’Like‘進行查詢 語法: where <列名> [NOT] Like <字符表達式> 2、使用’in‘在限定值內進行查詢 語法:wher

thinkphp資料庫查詢返回的結果

thinkphp資料庫查詢返回的幾種結果常用於判斷,如果結果不知道,就無法正確寫判斷語句。thinkphp無結果時常返回NULL,而不是false,這樣可能造成一些問題,!==false和===false。 select 有結果:array 無結果:NULL findAll 有結果:array 無結

mybatis - 關於多表查詢 結果的兩封裝方式(註解版 , xml版)

需求: 一對多查詢,查詢使用者,同時查詢賬號的集合! 案例分析:        1.一個使用者可以有多個賬號 , 也可以沒有賬號.        

mybatis學習(5):關聯查詢方式

文章末尾附上Employee.java  和 Department.java 方式一:聯合查詢:級聯屬性封裝結果集     <resultMap type="com.atguigu.mybatis.bean.Employee" id="MyDi

php檔案匯出方式

最近需要大資料匯出,於是在網上找了一下,在這進行一下整理,希望可以幫助到大家。 一、PHP 自帶函式 fputcsv 可以實現列印報表(Excel)功能 優點是: 1 執行效率高 2 不需要第三方庫 3 用起來很方便 4 實時生成。用流的形式傳輸 缺點是: 1 在 Linux 執行後,

Hive資料匯入匯出方式

一,Hive資料匯入的幾種方式 首先列出講述下面幾種匯入方式的資料和hive表。 Hive表: 建立testA: CREATE TABLE testA ( id INT, name string, area string ) PARTITIONED BY (crea

PLSql -- 遞迴查詢的另實現方式(函式/儲存過程)

問題 這是一個樹結構,查詢教師“胡明星”的所有主管及姓名:(無主管的教師也需要顯示),顯示(教師編號、教師名稱、主管編號、主管名稱) 解決1 declare v_tno hand_t

SQL Server 返回結果集的方式

1. 使用 Table Function 返回結果集 -- 1. table function use AdventureWorks2008 go if exists ( selec

三 JPA復雜查詢方式

rspec rep .get 很多 兩個 page 金額 ati con 多條件查詢有很多方式 接口命名策略 按照JPA的命名策略命名,就可以實現單條件或者多條件的等值查詢 命名策略 要以find或者findAll開頭,單字段查詢,find後跟字段的屬性名字,參數傳入字段的

往HIVE表中匯入匯出資料的方式詳解

一:往HIVE表中匯入匯出資料語法結構:[ ]帶括號的表示可選擇欄位LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTOTABLE tablename

獲取Linux核心未匯出符號的方式

從Linux核心的2.6某個版本開始,核心引入了匯出符號的機制。只有在核心中使用EXPORT_SYMBOL或EXPORT_SYMBOL_GPL匯出的符號才能在核心模組中直接使用。然而,核心並沒有匯出所有的符號。例如,在3.8.0的核心中,do_page_fault就沒有被匯出。     而我的核心模組中需要

hibernate資料查詢方式

1.使用主鍵id載入物件(load(),get()); 2.通過物件導航,比如通過stu.getTeam()得到team的例項; 3 使用hql; 4使用qbc(query by criteria) 5直接使用sql語句取得記錄集; 一般都使用後面三種方式. 注意.hql是面

總結Mysql 模糊查詢方式

兩個 detail inf 正則 查詢 配對 info 小寫 使用 總結下開發過程中用過模糊查詢功能所用的一些東西,還有就是在建表時一定要考慮完善在建表,否則後期數據量大了在改表會非常的麻煩,請不要為了能夠盡快用表而匆匆創建。在這也是給自己一個警醒,以後不再犯。 #sele

Eclipse安裝svn插件的方式 轉帖....

如果 version name feature help sin 鏈接 exe 文件 Eclipse安裝svn插件的幾種方式 1.在線安裝: (1).點擊 Help --> Install New Software... (2).在彈出的窗口中點擊add按鈕,輸

解決瀏覽器跨域的方式

doc cor 求和 對象 跨域 http onf 從服務器 console 1、什麽是跨域問題 在頁面中使用js訪問其他網站的數據時,就會出現跨域問題,比如在網站中使用ajax請求其他網站的天氣、快遞或者其他數據接口時,以及hybrid app中請求數據,