是这样的,我在dataGrap(连接了hive)写了脚本,脚本是这样的
insert overwrite table dwd_fact_order_detail partition (dt='$do_date')
select
t1.id,
t1.order_id,
t1.user_id,
t1.sku_id,
t1.sku_name,
t1.order_price,
t1.sku_num,
t1.create_time,
t1.province_id,
t1.source_type,
t1.source_id,
t1.original_amount_d,
`if`(t1.rk=1,t1.final_total_amount-(t1.final_amount_d_sum-final_amount_d),t1.final_amount_d) as final_amount_d,
`if`(t1.rk=1,t1.feight_fee-(t1.feight_fee_d_sum-t1.feight_fee_d),t1.feight_fee_d) as feight_fee_d ,
`if`(t1.rk=1,t1.benefit_reduce_amount-(t1.benefit_reduce_amount_d_sum-t1.benefit_reduce_amount_d),t1.benefit_reduce_amount_d) as benefit_reduce_amount_d
from
(
select
od.id,
od.order_id,
od.user_id,
od.sku_id,
od.sku_name,
od.order_price,
od.sku_num,
od.create_time,
oi.province_id,
od.source_type,
od.source_id,
oi.final_total_amount,
oi.feight_fee,
oi.benefit_reduce_amount,
ROUND(od.sku_num*od.order_price,2) as original_amount_d,-- 原始价格分摊
ROUND((od.sku_num*od.order_price/oi.original_total_amount)*oi.final_total_amount,2) as final_amount_d,--购买价格分摊
ROUND((od.sku_num*od.order_price/oi.original_total_amount)*oi.feight_fee,2) as feight_fee_d,-- 运费分担
ROUND((od.sku_num*od.order_price/oi.original_total_amount)*oi.benefit_reduce_amount,2) as benefit_reduce_amount_d, -- 优惠分担
sum(ROUND((od.sku_num*od.order_price/oi.original_total_amount)*oi.final_total_amount,2)) over(partition by od.order_id) as final_amount_d_sum,--购买价格分摊总和
sum(ROUND((od.sku_num*od.order_price/oi.original_total_amount)*oi.feight_fee,2)) over(partition by od.order_id) as feight_fee_d_sum,--运费分摊总和
sum(ROUND((od.sku_num*od.order_price/oi.original_total_amount)*oi.benefit_reduce_amount,2)) over(partition by od.order_id) as benefit_reduce_amount_d_sum,--运费分摊总和
rank() over(partition by od.order_id order by oi.original_total_amount desc) as rk
from
(
select * from ods_order_detail where dt='$do_date'
) od
join
(
select * from ods_order_info where dt='$do_date'
) oi
on od.order_id = oi.id
)t1;
然后在dataGrap中跑是正常的。把这段SQL复制到shell脚本中,就一直报FAILED: UDFArgumentException The function DECIMAL takes only primitive types。
最终找到原因:dataGrap中能识别 飘号 `` ,但是shell中`if`识别有错。所以在shell中去掉 if的飘号就可以了