首页 文章

使用gcloud cli执行具有多个输入/输出的Dataflow作业

提问于
浏览
0

我在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 回答

  • 2

    我终于通过一个巨大的反复试验过程找到了解决方案 . 涉及几个步骤 .

    - 参数的格式

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

    --parameters=inputLocations="object",outputLocations="object"
    

    转义对象

    然后,对象需要引用转义以避免过早地结束值,所以

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

    {\"location1\":\"gcs://bucket/whatever\"...
    

    选择其他分隔符

    接下来,CLI会混淆,因为虽然key = value对用逗号分隔,但值也在对象中有逗号 . 因此,您可以通过将它放在参数开头的carat( ^ )之间以及key = value对之间来定义不同的分隔符:

    --parameters=^*^inputLocations="{"\location1\":\"...\"}"*outputLocations="{"\location1\":\"...\"}"
    

    我使用 * 因为 ; 不起作用 - 也许是因为它标志着CLI命令的结束?谁知道 .

    另请注意 gcloud topic escaping 信息说:

    在Windows上的cmd.exe和PowerShell中,^是一个特殊字符,您必须通过重复它来转义它 . 在以下示例中,每次看到^时,将其替换为^^^^ .

    不要忘记customGcsTempLocation

    毕竟,我忘记了 customGcsTempLocation 需要添加 --parameters 参数中的key = value对 . 不要忘记用 * 将其与其他人分开,并再次将其括在引号中:

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

    几乎所有这些都没有在在线文档中解释过,所以我生命中的几天我都不会回来 - 希望我帮助了其他人 .

相关问题