我想使用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文件,用于触发触发数据流管道的云功能?
答案 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()
来提取值。