我在Dataprep中设计了一个数据转换,现在正尝试使用Dataflow中的模板来运行它 . 我的流有几个输入和输出 - 数据流模板将它们作为json对象提供,每个输入和位置都有键/值对 . 它们看起来像这样(添加了换行符以便于阅读):
{
"location1": "project:bq_dataset.bq_table1",
#...
"location10": "project:bq_dataset.bq_table10",
"location17": "project:bq_dataset.bq_table17"
}
我有17个输入(主要是查找)和2个输出(一个csv,一个bigquery) . 我将这些传递给 gcloud
CLI,如下所示:
gcloud dataflow jobs run job-201807301630 /
--gcs-location=gs://bucketname/dataprep/dataprep_template /
--parameters inputLocations={"location1":"project..."},outputLocations={"location1":"gs://bucketname/output.csv"}
但我收到一个错误:
ERROR: (gcloud.dataflow.jobs.run) unrecognized arguments:
inputLocations=location1:project:bq_dataset.bq_table1,outputLocations=location2:project:bq_dataset.bq_output1
inputLocations=location10:project:bq_dataset.bq_table10,outputLocations=location1:gs://bucketname/output.csv
从错误消息中,它看起来是合并输入和输出,因此我有两个输出,每两个输入与两个输出配对:
input1:output1
input2:output2
input3:output1
input4:output2
input5:output1
input6:output2
...
我已经尝试引用输入/输出对象(单个和双重,加上删除对象中的引号),将它们包装在 []
中,使用波浪线但没有快乐 . 有没有人设法执行多个输入的数据流作业?
1 回答
我终于通过一个巨大的反复试验过程找到了解决方案 . 涉及几个步骤 .
- 参数的格式
--parameters
参数是字典类型的参数 . 您可以通过在CLI中键入gcloud topic escaping
来阅读文档中的详细信息,但简而言之,这意味着您需要在--parameters
和参数之间使用=
,然后格式为key = value对,其值包含在引号中标记("
):转义对象
然后,对象需要引用转义以避免过早地结束值,所以
变
选择其他分隔符
接下来,CLI会混淆,因为虽然key = value对用逗号分隔,但值也在对象中有逗号 . 因此,您可以通过将它放在参数开头的carat(
^
)之间以及key = value对之间来定义不同的分隔符:我使用
*
因为;
不起作用 - 也许是因为它标志着CLI命令的结束?谁知道 .另请注意
gcloud topic escaping
信息说:不要忘记customGcsTempLocation
毕竟,我忘记了
customGcsTempLocation
需要添加--parameters
参数中的key = value对 . 不要忘记用*
将其与其他人分开,并再次将其括在引号中:几乎所有这些都没有在在线文档中解释过,所以我生命中的几天我都不会回来 - 希望我帮助了其他人 .