在shell脚本中使用hive命令

时间:2014-06-04 10:42:01

标签: bash hadoop hive

我有一个问题,我需要将列传递给将在另一个shell脚本中使用的shell脚本。然后我需要遍历列并进行一些处理;我想将输出存储在Hive表中。

但我不明白我应该如何将每次迭代的输出存储在同一个Hive表中。 谁能建议我怎么做?

#!/bin/bash ./hive -S -e "use telecom;select case when $1/2>avg($1) over (partition by 1) then $1 end from telecom_tr1;"

我这里只传递一个列名,但是,是否可以传递多个列名并将输出保存在一个Hive表中?

编辑:

示例输出如果我将三列作为我的shell脚本的输入,我的hive输出表应该如下所示.Script将遍历传递的参数Query将为每次迭代执行一些处理并且应该将结果存储在一个hive表中仅用于每个迭代(列)

scrip input: sh test.sh col1 col2 col3

expected output: iteration one | iteration two | iteration three

2 个答案:

答案 0 :(得分:0)

以下是粗暴的做法

- myQuery.hql

  use telecom;

  Create table my_temp_table_${iterationNo} as
  select my_temp_table_${old_iterationNo}.* ,(select case when $iterationNo/2>avg($iterationNo) over (partition by 1) then $1 end from telecom_tr1;) as Iteration_2 
  from my_temp_table_${old_iterationNo};

  drop table my_temp_table_${old_iterationNo};
在Bash中

只是迭代你称之为HQL的params

  hive -d iterationNo = $current -d old_iterationNo=$prev -f myQuery.hql

答案 1 :(得分:0)

您可以在Hive中创建分区表,这样可以轻松解决此问题。基本格式如下所示:

create table my_table (field string) partitioned by (iter int);

INSERT OVERWRITE TABLE my_table partition (iter=${iter})
select case when $1/2>avg($1) over (partition by 1) then $1 end from telecom_tr1;

这将返回每次运行附加查询的结果,并使用名为iter的列指定结果来自哪个迭代。