2016-10-07 30 views
0

我在S3上使用HIVE作爲ETL過程處理原始數據。我生成的結構化輸出數據在加載到另一個數據庫(紅移)之前被排序。 數據需要在可管理塊的排序序列中加載到紅移中,例如每塊5-10億行,其中總數據集是100億條記錄。HIVE - 將大型有序查詢結果集拆分爲多個連續文件

我正在尋找配置單元對數據進行排序,然後將其分解成更小的可管理塊,這些塊可以按排序順序逐個上傳。 到目前爲止,我還沒有能夠提出一種方法來允許我這樣做。在我使用「Oder By」子句的情況下,配置單元中的還原器數量被強制爲1,因此我得到一個龐大的文件! 我沒有辦法將這樣一個巨大的文件從S3中解壓縮/拆分/重新壓縮/重新加載,因爲我沒有辦法做到這一切。

使用「Cluster By」生成內部排序的塊,但不保證塊之間的順序。

排序鍵是一個複合字母數字鍵,而不同的計數太大而無法分區。

與羣集問題/分發:

與簇中的問題,並從我的理解是,偏偏分配基於分發密鑰的散列分發選項。如果x < y,那麼hash(x)不能保證小於hash(y)。因此,在生成的文件中,數據不會被排序。

回答

-1

一個可能的解決方案可能是在完整排序的輸出上使用bash split命令將其分解爲更小的文件。

以下是從該名男子頁採取:

NAME 
     split - split a file into pieces 

SYNOPSIS 
     split [OPTION]... [INPUT [PREFIX]] 

DESCRIPTION 
     Output fixed-size pieces of INPUT to PREFIXaa, PREFIXab, ...; default size is 1000 lines, and default PREFIX is 'x'. With no INPUT, or when INPUT is -, read 
     standard input. 

     Mandatory arguments to long options are mandatory for short options too. 

     -a, --suffix-length=N 
       use suffixes of length N (default 2) 

     -b, --bytes=SIZE 
       put SIZE bytes per output file 

     -C, --line-bytes=SIZE 
       put at most SIZE bytes of lines per output file 

     -d, --numeric-suffixes 
       use numeric suffixes instead of alphabetic 

     -l, --lines=NUMBER 
       put NUMBER lines per output file 

     --verbose 
       print a diagnostic just before each output file is opened 

     --help display this help and exit 

     --version 
       output version information and exit 

     SIZE may be (or may be an integer optionally followed by) one of following: KB 1000, K 1024, MB 1000*1000, M 1024*1024, and so on for G, T, P, E, Z, Y. 

所以,像這樣:

分裂-l 50億名

可能會奏效。從蜂巢

+0

我已經在我的文章中提到過,我沒有空間讓這個文件關閉S3來做到這一點,並把它放回去。該單個文件可能很容易成爲1TB –

0

加載S3: 你可以指定一個外部文件的蜂巢(當您使用順序按蜂巢生成一個大文件)使用LOCATION 's3://<bucket>/etc這樣的話,不亦樂乎就會把它直接進入S3。

手動加載:當您使用排序方式時,應對排序中的數據進行排序。您是否嘗試使用單獨的數據,以便在排序時通過某個鍵分配數據。

應該選擇分配密鑰,以便應該在一個存儲桶中的所有記錄不會將任何其他文件存入您的計算機。

+0

我已經在S3中生成了一個非常大的文件。但我無法一次加載它,這就是爲什麼我需要一種方法來打破它。現在分配密鑰的問題是數據是基於密鑰的散列分佈的。所以我們假設我的數據按名稱排序。名稱散列到不同文件將破壞文件之間的排序順序。每個文件將按名稱排序,但跨文件的數據不再排序。 –

+0

是的,您的分發密鑰應邏輯地劃分數據。例如,假設你在學校有學生的評分 - 如果你按班級分類並對我的分數進行分類,那麼你仍然可以使用這些數據。這裏Marks的全球排序不會幫助你。如果可以的話,分享源數據模型,這樣可能會出現一些建議。 –

0

你可以嘗試使用表格來創建一些數量相近的分區,這些分區會更容易操作。

Create table mytable (
record_ID string, 
var1 double 
) 
clustered by record_ID into 100 buckets; 


set hive.enforce.bucketing = true; 
from my_other_table 
insert overwrite table mytable 
select *; 

此外,您可以創建一個由它的隨機數和分區爲好。在配置單元中使用random()udf同樣容易。

+0

通過將record_ID分組到100個桶中,將記錄1和101放入同一個文件中。記錄2和102進入相同的文件。這打破了我正在尋找的排序順序。 –

+0

您需要創建一個變量來保存您的訂單,然後對其進行分區。 – invoketheshell