2016-01-04 70 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)时,它会正确存储。所以这需要更改布局以确保更新比例。