使用bash向hive脚本发送可变数量的字段

时间:2017-10-06 19:21:02

标签: bash hadoop hive hiveql

我通过使用bash脚本将csvs移动到HDFS并在其上构建外部Hive表来自动化数据管道。目前,这只适用于在.hql文件中预定义表格式的情况。但是我希望能够从CSV中读取标题并将它们作为参数发送给Hive。所以目前我在循环文件中执行此操作:

# bash
hive -S -hiveconf VAR1=$target_db -hiveconf VAR2=$filename -hiveconf VAR3=$target_folder/$filename -f create_tables.hql 

发送到此...

-- hive
CREATE DATABASE IF NOT EXISTS ${hiveconf:VAR1};         
CREATE EXTERNAL TABLE IF NOT EXISTS ${hiveconf:VAR1}.${hiveconf:VAR2}(  
  individual_pkey INT,      
  response CHAR(1)        
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','   
LOCATION '/${hiveconf:VAR3}' 

我希望hive脚本看起来更像这样......

CREATE DATABASE IF NOT EXISTS ${hiveconf:VAR1};         
CREATE EXTERNAL TABLE IF NOT EXISTS ${hiveconf:VAR1}.${hiveconf:VAR2}(  
  ${hiveconf:ROW1} ${hiveconf:TYPE1},
  ...              ...
  ${hiveconf:ROW_N} ${hiveconf:TYPE_N}

ROW FORMAT DELIMITED FIELDS TERMINATED BY ','   
LOCATION '/${hiveconf:VAR3}'

是否可以发送它会解析的某种数组?这是可行的还是可行的?

1 个答案:

答案 0 :(得分:1)

我最终找到了解决这个问题的方法。

您无法真正编写一个包含可变数量字段的HQL脚本。但是,您可以编写一个bash脚本来生成可变长度的HQL脚本。我已经为我的团队实现了这个,但一般的想法是写出你希望HQL在bash中看起来像一个字符串的方式,然后用Rscript之类的东西读入并识别你的CSV的数据类型。将数据类型与CSV标头一起存储为数组,然后循环遍历这些数组,将信息写入HQL。