2017-10-18 379 views
0

据我所知,dataproc工作流程模板仍处于测试阶段,但您如何通过添加作业将参数传递到可执行文件sql?这是一个基本的例子:通过dataproc工作流程模板传递参数

#/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` 

这里从外壳打电话给我的第一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 EXISTS PARTITION(dt =“2017-10-31”);)分区被创建,但不幸的是它需要参数化。

顺便说一句 - 我收到的错误是一直这样的: 错误:错误在编译声明:失败:ParseException的线1:48无法识别附近“$ {} DATE_PARTITION”“)”“在不断

”输入

我可能很接近但不确定我缺少什么。

TIA, 梅丽莎

回答

0

感谢您试用工作流程!对参数化的一流支持是我们路线图的一部分。但是现在你的移除工作/添加工作技巧是最好的方法。

关于你提到的具体问题:

  • 通过PARAMS传递值作为${hivevar:PARAM}访问(见[1])。或者,您可以设置--properties,它们被访问为${PARAM}

  • 不需要params周围的括号。如果它旨在处理参数值空间使用像语录:--params="FOO=a b c,BAR=X"

  • 最后,我在空DATE_PARTITION值这里DATE_PARTITION =$1这可能导致注意到一个错误的空间

希望这有助于!

[1] How to use params/properties flag values when executing hive job on google dataproc

+0

呃......谢谢你,工作。我将原始文章中的代码示例更正为工作版本,并将其用于帮助其他人。 :) – Melissa