Google数据流:AvroIO从谷歌存储中的文件读取作为运行时参数传递

时间:2017-11-16 14:21:49

标签: google-cloud-dataflow google-cloud-functions avro apache-beam gcp

我想使用java SDK 2在我的数据流中读取Avro文件 我已根据上传到存储桶的文件触发了使用云功能的数据流计划。

以下是选项代码:

ValueProvider <String> getInputFile();
void setInputFile(ValueProvider<String> value);

我正在尝试使用以下代码读取此输入文件:

PCollection<user> records = p.apply(
    AvroIO.read(user.class)
    .from(String.valueOf(options.getInputFile())));

运行管道时出现以下错误:

java.lang.IllegalArgumentException: Unable to find any files matching RuntimeValueProvider{propertyName=inputFile, default=gs://test_bucket/user.avro, value=null}

相同的代码在TextIO的情况下工作正常 我们如何读取上传的Avro文件,用于触发触发数据流管道的云功能?

2 个答案:

答案 0 :(得分:0)

请尝试...from(options.getInputFile()))而不将其转换为字符串。

为简单起见,您甚至可以将选项定义为简单字符串:

   String getInputFile();
   void setInputFile(String value);

答案 1 :(得分:0)

您只需使用from(options.getInputFile())AvroIO明确支持从ValueProvider阅读。

目前代码正在使用options.getInputFile() ValueProvider,在其上调用Java toString()函数,它提供了一个人类可读的调试字符串"RuntimeValueProvider{propertyName=inputFile, default=gs://test_bucket/user.avro, value=null}",并将其传递为要读取AvroIO的文件名,当然这个字符串不是有效的文件名,这就是代码当前不起作用的原因。

另请注意,ValueProvider的重点是它是构造管道时未知的值的占位符,稍后将提供(可能会执行管道)多次,提供不同的值) - 因此在设计时不可能在管道建设时提取ValueProvider的值,因为没有价值。但是在运行时(例如在DoFn中),您可以通过调用.get()来提取值。