2016-01-04 72 views
0

我想將Pig BigDecimal轉換爲Hive十進制類型,但值被gettined null。下面是示例代碼:Pig BigDecimal to Hive十進制

豬腳本:

a = LOAD 'test.txt' using TextLoader() as (col1:chararray,col2:int,col3:chararray,col4:int); 
    b = foreach a generate *,1 as rec_cnt; 
    c = group b by col1,col3; 
    d = foreach c generate flatten(group),(bigdecimal) SUM(rec_cnt) as grp_code; 
STORE d into 'user/test' Using PigStorage(','); 
STORE d into 'default.test' using org.apache.hive.hcatalog.pig.HCatStorer(); 

在上面的代碼中,記錄計數的總和值被適當地進來存儲爲「用戶/測試」的HDFS文件。但是對於HcatStorer,對於所有記錄,相同的字段填充NULL。測試表是使用此DECIMAL(16,0)的列定義創建的。我正在使用Hive 1.1.0。請建議如何解決這個問題。

+0

任何消息?你看過其他類似的問題嗎? –

+0

爲什麼你在一個DOUBLE中存儲一個整數「1」?爲什麼計數記錄(例如,將這些1加起來)寫入BIGDECIMAL?使用LONG或BIGINTEGER會更有意義... –

+0

最終結果需要用十進制表示,因爲下游需要十進制格式。將整型「1」轉換爲DOUBLE不是必需的,我只是嘗試了不同的選項來存儲十進制格式的最終​​總和,但無論以何種方式將它總結在配置單元表中,它都被存儲爲NULL。更新了代碼以刪除重複投射。 – HarishKotha

回答

0

我終於弄清楚了null的原因。 Hcatalog會在將pig中的bigdecimal轉換爲hive中的Decimal時進行範圍檢查。由於Hive定義中沒有比例尺(即DECIMAL(16,0)),因此在存儲範圍檢查期間默認爲空。當我將Hive定義更改爲DECIMAL(16,2)時,它會正確存儲。所以這需要更改佈局以確保更新比例。