4

我在 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)。我将这些传递给gcloudCLI,如下所示:

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

我试过引用输入/输出对象(单和双,加上删除对象中的引号)[],用波浪线将它们包裹起来,但没有任何乐趣。有没有人设法执行具有多个输入的数据流作业?

4

1 回答 1

17

经过大量的反复试验,我终于找到了解决方案。涉及几个步骤。

格式--parameters

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

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

逃离物体

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

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

变成

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

选择不同的分隔符

接下来,CLI 变得混乱,因为虽然 key=value 对由逗号分隔,但值在对象中也有逗号。^因此,您可以通过将其放在参数开头的克拉 ( ) 之间以及 key=value 对之间来定义不同的分隔符:

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

我使用*是因为;没有用 - 也许是因为它标志着 CLI 命令的结束?谁知道。

另请注意,gcloud topic escaping信息说:

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

不要忘记customGcsTempLocation

毕竟,我忘记了customGcsTempLocation需要在参数中添加键=值对--parameters。不要忘记用 a 将其与其他人分开,*并再次用引号将其括起来:

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

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

于 2018-08-10T10:08:23.033 回答