我正在尝试执行写入BigQuery的Dataflow管道。我知道为了做到这一点,我需要指定一个GCS临时位置。
所以我定义了选项:
private interface Options extends PipelineOptions {
@Description("GCS temp location to store temp files.")
@Default.String(GCS_TEMP_LOCATION)
@Validation.Required
String getTempLocation();
void setTempLocation(String value);
@Description("BigQuery table to write to, specified as "
+ "<project_id>:<dataset_id>.<table_id>. The dataset must already exist.")
@Default.String(BIGQUERY_OUTPUT_TABLE)
@Validation.Required
String getOutput();
void setOutput(String value);
}
并尝试将其传递给Pipeline.Create()
函数:
public static void main(String[] args) {
Pipeline p = Pipeline.create(PipelineOptionsFactory.fromArgs(args).withValidation().as(Options.class));
...
}
但是我收到以下错误。我不明白为什么,因为我注释with@Default
:
Exception in thread "main" java.lang.IllegalArgumentException: Expected getter for property [tempLocation] to be marked with @Default on all [my.gcp.dataflow.StarterPipeline$Options, org.apache.beam.sdk.options.PipelineOptions], found only on [my.gcp.dataflow.StarterPipeline$Options]
答案 0 :(得分:1)
以上代码段是您的代码还是SDK中的副本?
您没有为此定义新的选项类。你真的想在BigQueryIO.Write [1]上调用withCustomGcsTempLocation。
另外,我认为BQ应该自己决定一个临时位置,如果你不提供它。你试过没试过吗?你收到错误了吗?
大多数用户只需设置登台目录。要设置暂存目录,您需要执行以下操作:
DataflowPipelineOptions options = PipelineOptionsFactory.create()
.as(DataflowPipelineOptions.class);
options.setRunner(BlockingDataflowPipelineRunner.class);
options.setStagingLocation("gs://SET-YOUR-BUCKET-NAME-HERE");
但是如果你想设置gcpTemporaryDirectory,你也可以这样做:
GcpOptions options = PipelineOptionsFactory.as(GcpOptions.class);
options.setGcpTempLocation()
基本上你必须做.as(X.class)来获得X选项。然后,一旦拥有该对象,您就可以设置属于X的任何选项。您可以在线找到许多其他示例。