Google cloud dataflow 属性[tempLocation]的getter应在所有

Google cloud dataflow 属性[tempLocation]的getter应在所有,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我正在尝试执行一个写入BigQuery的数据流管道。我理解,为了做到这一点,我需要指定一个GCS临时位置 所以我定义了选项: 专用接口选项扩展了PipelineOptions{ @说明(“用于存储临时文件的GCS临时位置”) @默认.String(GCS\U临时位置) @验证。必需 字符串getTempLocation(); void setTempLocation(字符串值); @说明(“要写入的BigQuery表,指定为” +“:…数据集必须已经存在。”) @Default.String(B

我正在尝试执行一个写入BigQuery的数据流管道。我理解,为了做到这一点,我需要指定一个GCS临时位置

所以我定义了选项:

专用接口选项扩展了PipelineOptions{
@说明(“用于存储临时文件的GCS临时位置”)
@默认.String(GCS\U临时位置)
@验证。必需
字符串getTempLocation();
void setTempLocation(字符串值);
@说明(“要写入的BigQuery表,指定为”
+“:…数据集必须已经存在。”)
@Default.String(BIGQUERY\u输出\u表)
@验证。必需
字符串getOutput();
void setOutput(字符串值);
}
并尝试将其传递到
管道。Create()
函数:

public static void main(String[] args) {
    Pipeline p = Pipeline.create(PipelineOptionsFactory.fromArgs(args).withValidation().as(Options.class));
    ...
}
但是我得到了以下错误。我不明白为什么,因为我注释了
with@Default


上面的代码片段是您的代码还是SDK的副本

您没有为此定义新的选项类。实际上,您需要在BigQueryIO.Write[1]上调用CustomGCStemplocation

此外,我认为如果您不提供临时位置,BQ应该自行确定临时位置。你试过没有设置这个吗?你有错误吗

[1]

大多数用户只需设置临时目录。要设置临时目录,您需要执行以下操作:

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的选项。你可以在网上找到更多的例子。

我试着修改SDK中的代码。我基本上将接口的名称改为“Options”,并添加了与模板定位相关的方法。目前,我删除了与tempLocation相关的方法,并将tempLocation作为en参数输入。如何设置BQ默认临时位置?仅添加一个选项不起作用。您必须在正确的位置使用该选项。您不需要设置自己的选项(该选项已经可用)。我提供了您需要调用的代码,以设置答案中的位置。它不在选项中,而是在写入本身上。您是在尝试设置常规临时位置还是特定于bigquery的临时位置?我对数据流非常陌生,因此如果我的答案不清楚或离题,请提前见谅。我想我正在尝试设置常规临时位置,因为只有在Eclipse运行配置窗口的管道参数中指定
org.apache.beam.sdk.options.PipelineOptions
中的
模板位置时,管道才会执行。啊,好的,那只是一个临时目录,与BigQuery无关(尽管BigQuery可能会使用它,如果您不指定一个单独的选项)。
GcpOptions options = PipelineOptionsFactory.as(GcpOptions.class);
options.setGcpTempLocation()