Hive從S3中對映資料檔案以及對映分割槽資料

2021-10-05 12:22:02 字數 4154 閱讀 4796

之前也沒接觸過aws對之不是很熟悉,但最近有需求需要在aws的emr中,用hive去獲取s3桶(或者指定桶內資料夾)內的資料,這裡記錄一下。

emr,安裝hadoop集群,hive

1.直接對映資料

直接將s3中的資料檔案對映到hive表,不做任何處理。這個時候直接在hive中建立表的時候指定s3資料檔案的對映路徑即可。

這裡要注意,切分欄位的關鍵字元必須必須必須是資料中的唯一切分欄位的識別符號。即資料中除了字段切分用得到,其他沒有任何資料報含該識別符號。

create external table

ifnot

exists

`lyb0`

(`code` string comment

'import id'

,`vin` string comment

'import name'

,`vichel` string comment

'import message'

)row format delimited fields

terminated

by','

lines

terminated

by'\n' stored as textfile

location 's3://volvo-region-emr-test/datainput/data/lyb'

;

上面的location即為hive建立表的時候指定的s3的對映路徑,它會直接對映該資料夾下的所有檔案的所有資料,即所有檔案的資料都會對映到這個表中,包括每個檔案的第一行(有些資料來源第一行一般都是欄位名稱,而不是資料)。

這個時候你看到的表裡面的資料是這樣的

先附上測試檔案的資料。

這個時候查詢表的資料是醬紫的。。。驚不驚喜?意不意外?而且注意我這裡建立表的時候只寫了三個字段,那就會預設把三列欄位的資料跟我的表的字段去對應,也就是說第四列沒了。如果想要全部資料,直接字段對應好即可。

下面再說一下不想要檔案中的第一行(一般都是欄位名,不是資料的一行),該咋整呢? 這裡給出兩種方法:

2.去除檔案頭後對映資料

法一:一種是在sql末尾直接加上一行tblproperties(「skip.header.line.count」=「1」) ,即配置tblproperties引數直接跳過1行。修改後sql如下:

create external table

ifnot

exists

`lyb0`

(`code` string comment

'import id'

,`vin` string comment

'import name'

,`vichel` string comment

'import message'

)row format delimited fields

terminated

by','

lines

terminated

by'\n' stored as textfile

location 's3://volvo-region-emr-test/datainput/data/lyb'

tblproperties(

"skip.header.line.count"

="1"

);

這個時候再重新執行建表對映資料的sql語句,查詢結果:

**法二:**即為下面3例項中的設定s3select引數。

3.使用s3select的方式匯入資料

借鑑aws官方文件的案例,hive將資料匯入表使用s3select的方式,鏈結hive-s3select

別忘了設定過濾器引數為true哦,不然第一行的資料還是沒有去掉的。

set s3select.filter=

true

;

結果如下:

hive一般分割槽都是按年月日來做動態分割槽,也就是說平常我們會把前一天的資料匯入到某個表的時候動態指定那一天的日期,但是當匯入的是歷史資料的時候,即並不知道資料是哪一天或者即使知道資料是某一天,但是由於源資料的陳列並不是按照這個方式,是按照另一種方式去陳列的,並無規律性,這個時候如果資料量還比較大需要分割槽的時候怎麼辦呢?

當然還是直接partitioned by啦!但是這裡有個需要注意的地方。首先s3桶中的資料檔案命名是要按一定格式的,如下:(分割槽字段=分割槽值)

首先貼上sql,實際上就是比著上面的多了行partitioned by而已,hive直接對映分割槽和s3select兩種方式都一樣,都是多指定partitioned by,這裡先使用直接對映方式:

create external table

ifnot

exists

`lyb0`

(`code` string comment

'import id'

,`vin` string comment

'import name'

,`vichel` string comment

'import message'

)partitioned by

(vin_id string)

row format delimited fields

terminated

by','

lines

terminated

by'\n' stored as textfile

location 's3://volvo-region-emr-test/datainput/data/lyb'

tblproperties(

"skip.header.line.count"

="1"

);

建表成功之後這個時候發現查資料是查不到的???為什麼呢?

因為這個時候分割槽表的分割槽資訊並沒有載入到hive的metastore中,需要先執行將分割槽資訊載入到metastore中,才可以查詢到資料。

載入表的分割槽資訊到metastore中:

從s3中將表的分割槽資訊載入到hive的metastore中,這個同從hdfs中載入表的分割槽資訊是一樣的,執行以下命令進行載入:

msck repair table lyb0;

[這裡是你的table_name]

我們來執行一下看一下效果,也可以根據分割槽查資料結果如下:

也可以使用命令檢視表的分割槽:

哦對了,有時候可能還會出現從s3匯入csv檔案到hive表裡面出現中文亂碼的情況,試試這個命令吧

alter

table

*[table_name]

*set serdeproperties (

'serialization.encoding'

='gbk'

);

hive操作s3資料

1 hive配置s3訪問許可權 2 建立表 例如create external table table create time bigint comment 獲取時的時間 event name string comment 事件名 timestamp bigint comment 事件發生時間 is...

Hive中建立S3的外部表

hive中建立s3的外部表 資料在s3存放的資料是按時間緯度存放的,每天的資料存放在各自的目錄下,目錄結構如下截圖 每個目錄下面的資料是csv檔案,現在將其匯入到hive中進行查詢,通過建立對應的表結構 sql view plain copy hadoop到s3 hadoop distcp hdfs...

hive ,從hdfs把資料檔案load匯入到表

hive load data inpath hdfs ns1 abc sales info hello sales info.txt overwrite into table sales info partition dt 2019 04 26 1 原資料檔案 已經不存在了,是從原路徑移動到了新路徑...