Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud platform 使用gcloud cli执行具有多个输入/输出的数据流作业_Google Cloud Platform_Google Cloud Dataflow_Gcloud_Google Cloud Dataprep - Fatal编程技术网

Google cloud platform 使用gcloud cli执行具有多个输入/输出的数据流作业

Google cloud platform 使用gcloud cli执行具有多个输入/输出的数据流作业,google-cloud-platform,google-cloud-dataflow,gcloud,google-cloud-dataprep,Google Cloud Platform,Google Cloud Dataflow,Gcloud,Google Cloud Dataprep,我已经在Dataprep中设计了一个数据转换,现在正试图使用Dataflow中的模板来运行它。My flow有几个输入和输出-dataflow模板将它们作为json对象提供,每个输入和位置都有键/值对。它们如下所示(添加了换行符以便于阅读): 我有17个输入(大部分是查找)和2个输出(一个csv,一个bigquery)。我将这些信息传递到gcloudCLI,如下所示: gcloud dataflow jobs run job-201807301630 / --gcs-location=g

我已经在Dataprep中设计了一个数据转换,现在正试图使用Dataflow中的模板来运行它。My flow有几个输入和输出-dataflow模板将它们作为json对象提供,每个输入和位置都有键/值对。它们如下所示(添加了换行符以便于阅读):

我有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
...

我尝试引用输入/输出对象(单引号和双引号,加上删除对象中的引号),将它们包装在
[]
中,使用波浪线,但没有乐趣。有没有人能够用多个输入执行数据流作业?

我通过大量的尝试和错误,终于找到了解决方案。其中包括几个步骤

--参数的格式
--parameters
参数是字典类型的参数。通过在CLI中键入
gcloud topic escaping
可以阅读文档中的详细信息,但简而言之,这意味着您将需要
=
--参数
和参数之间,然后格式为键=值对,值用引号括起来(
):

逃离物体 然后,对象需要转义引号以避免过早结束值,因此

{"location1":"gcs://bucket/whatever"...
变成

{\"location1\":\"gcs://bucket/whatever\"...
选择不同的分隔符 接下来,CLI会感到困惑,因为虽然key=value对用逗号分隔,但对象中的值也有逗号。因此,您可以通过将分隔符放在参数开头的克拉(
^
)之间以及key=value对之间来定义不同的分隔符:

--parameters=^*^inputLocations="{"\location1\":\"...\"}"*outputLocations="{"\location1\":\"...\"}"
我使用
*
是因为
不起作用-可能是因为它标志着CLI命令的结束?谁知道呢

还要注意,
gcloud主题转义
info说:

在Windows上的cmd.exe和PowerShell中,^是一个特殊字符,并且 你必须通过重复来逃避它 你看^,用^^^替换它

别忘了
customGcsTempLocation
在这一切之后,我忘记了
customGcsTempLocation
需要添加到
--parameters
参数中的key=value对。不要忘记用
*
将其与其他参数分开,并再次用引号括起来:

...}*customGcsTempLocation="gs://bucket/whatever"

在线文档中几乎没有对此进行解释,所以我这几天都不会回来了-希望我在这方面帮助过其他人。

hello Adam,感谢这篇文章。它帮助我部署了我的管道。另一方面,你是否通过java脚本完成所有ETL操作。我能提供参考文章吗请参阅,以帮助在数据流上开发复杂的ETL操作。任何指针都会有很大帮助。@akashsharma不,我们使用的是Cloud Dataprep,它生成一个数据流模板
--parameters=^*^inputLocations="{"\location1\":\"...\"}"*outputLocations="{"\location1\":\"...\"}"
...}*customGcsTempLocation="gs://bucket/whatever"