hive中使用transform小例子
代码:
set mapred.cache.archives=hdfs://host:54310/app/ns/test/php.tgz#home;
set HDFS_PHP=home/know/odp/php -c home/know/odp/php/etc/php.ini;
add file `pwd`/test.php;
set mapred.reduce.tasks=10
insert overwrite directory '${output}/output/'
select transform(b.qid,b.time)
using '${hiveconf:HDFS_PHP} test.php'
as qid,endcode_qid
from (
select /*+mapjoin(pm)*/
qb.qid as qid,qb.create_time as time
from test_q qb
join test_a pm
on (qb.dt='${dt}'and pm.dt='qid' and pm.id=qb.qid )
) b
注意:
1.上面的例子在hive上是不能直接运行的,因为上面的例子我是写在shell中的
2.用transform 时防止集群本身没有环境可以把环境依赖包打包
用 set mapred.cache.archives=hdfs://host:54310/app/ns/test/php.tgz#home;
#home指的是一个包的别名,因此
set HDFS_PHP=home/usr/php/php -c home/know/odp/php/etc/php.ini;
这里直接使用home
3.如果是直接在shell 中运行hive -e 执行上述脚本,可能运行会报错
hive 中的变量替换会与${hiveconf:} shell 中的变量替换冲突
因此在shell中最好不用${hiveconf:}
4.home/know/odp/php 这个路径意思是说home是整个包的别名,/know/odp/php包被解压后的完整路径