据我所知,dataproc workflow-templates仍然处于测试阶段,但是如何通过add-job将参数传递给可执行文件sql?这是一个基本的例子:
#/bin/bash
DATE_PARTITION=$1
echo DatePartition: $DATE_PARTITION
# sample job
gcloud beta dataproc workflow-templates add-job hive \
--step-id=0_first-job \
--workflow-template=my-template \
--file='gs://mybucket/first-job.sql' \
--params="DATE_PARTITION=$DATE_PARTITION"
gcloud beta dataproc workflow-templates run $WORK_FLOW
gcloud beta dataproc workflow-templates remove-job $WORK_FLOW --step-
id=0_first-job
echo `date`
这是我从shell调用的第一个job.sql文件:
SET hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
SET mapred.output.compress=true;
SET hive.exec.compress.output=true;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
SET io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;
USE mydb;
CREATE EXTERNAL TABLE if not exists data_raw (
field1 string,
field2 string
)
PARTITIONED BY (dt String)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LOCATION 'gs://data/first-job/';
ALTER TABLE data_raw ADD IF NOT EXISTS PARTITION(dt="${hivevar:DATE_PARTITION}");
在ALTER TABLE语句中,正确的语法是什么?我尝试过15种不同的变化,但没有任何效果。如果我像这样硬编码(ALTER TABLE data_raw ADD IF NOT NOT EXISTS PARTITION(dt =" 2017-10-31");)分区被创建,但不幸的是它需要参数化。
BTW - 我收到的错误一直是这样的: 错误:编译语句时出错:FAILED:ParseException行1:48无法识别' $ {DATE_PARTITION}'附近的输入')' ''常数
我可能很接近,但不确定我错过了什么。
TIA, 梅丽莎
答案 0 :(得分:1)
更新:Dataproc现在具有工作流程模板参数化功能,一个beta功能:
https://cloud.google.com/dataproc/docs/concepts/workflows/workflow-parameters
对于您的具体情况,您可以执行以下操作:
gcloud beta dataproc workflow-templates create my-template
gcloud beta dataproc workflow-templates add-job hive \
--step-id=0_first-job \
--workflow-template=my-template \
--file='gs://mybucket/first-job.sql' \
--params="DATE_PARTITION=PLACEHOLDER"
gcloud beta dataproc workflow-templates export my-template \
--destination=hive-template.yaml
jobs:
- hiveJob:
queryFileUri: gs://mybucket/first-job.sql
scriptVariables:
DATE_PARTITION: PLACEHOLDER
stepId: 0_first-job
parameters:
- name: DATE_PARTITION
fields:
- jobs['0_first-job'].hiveJob.scriptVariables['DATE_PARTITION']
gcloud beta dataproc workflow-templates import my-template \
--source=hive-template.yaml
gcloud beta dataproc workflow-templates set-managed-cluster my-template \
--cluster-name=my-cluster \
--zone=us-central1-a
gcloud beta dataproc workflow-templates instantiate my-template \
--parameters="DATE_PARTITION=${DATE_PARTITION}"
答案 1 :(得分:0)
感谢您尝试使用Workflows!对参数化的一流支持是我们路线图的一部分。但是现在你的删除工作/添加工作技巧是最好的方法。
关于您的具体问题:
通过params传递的值作为${hivevar:PARAM}
访问(参见[1])。或者,您可以将--properties
设置为${PARAM}
不需要params周围的括号。如果它打算处理参数值中的空格,请使用以下引用:--params="FOO=a b c,BAR=X"
最后,我注意到DATE_PARTITION =$1
的空格错误,可能会导致空DATE_PARTITION
值
希望这有帮助!
[1] How to use params/properties flag values when executing hive job on google dataproc