我通过使用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}'
是否可以发送它会解析的某种数组?这是可行的还是可行的?
答案 0 :(得分:1)
我最终找到了解决这个问题的方法。
您无法真正编写一个包含可变数量字段的HQL脚本。但是,您可以编写一个bash脚本来生成可变长度的HQL脚本。我已经为我的团队实现了这个,但一般的想法是写出你希望HQL在bash中看起来像一个字符串的方式,然后用Rscript
之类的东西读入并识别你的CSV的数据类型。将数据类型与CSV标头一起存储为数组,然后循环遍历这些数组,将信息写入HQL。