如何读取资源文件? (google云大法流)

How to read the resource file? (google cloud dafaflow)

我的 Dataflow 管道需要读取资源文件 GeoLite2-City.mmdb。我将它添加到我的项目和 运行 管道中。我确认项目包 zip 文件存在于 GCS 上的暂存存储桶中。

但是,当我尝试读取资源文件 GeoLite-City.mmdb 时,我得到一个 FileNotFoundException。我怎样才能解决这个问题?这是我的代码:

String path = myClass.class.getResource("/GeoLite2-City.mmdb").getPath();

File database = new File(path);

try
{

DatabaseReader reader = new DatabaseReader.Builder(database).build(); //<-this line get a FileNotFoundException

}

catch (IOException e)

{

LOG.info(e.toString());

}

我的项目包 zip 文件是 "classes-WOdCPQCHjW-hRNtrfrnZMw.zip" (它包含 class 个文件和 GeoLite2-City.mmdb

路径值为“file:/dataflow/packages/staging/classes-WOdCPQCHjW-hRNtrfrnZMw.zip!/GeoLite2-City.mmdb”,但无法打开。

这是选项。

--runner=BlockingDataflowPipelineRunner 
--project=peak-myproject 
--stagingLocation=gs://mybucket/staging 
--input=gs://mybucket_log/log.68599ca3.gz

目标是在 GCS 上 t运行sform 日志文件,并将 t运行sformed 数据插入 BigQuery。 当我 运行 在本地时,成功导入到 Bigquery。 我认为本地 PC 和 GCE 在获取资源路径方面存在差异。

我认为问题可能在于 DatabaseReader 不支持位于 .zip 或 .jar 文件中的资源路径。

如果是这样,那么您的程序可以使用 DirectPipelineRunner 不是因为它是直接的,而是因为资源只是位于本地文件系统而不是 .zip 文件中(正如您的评论所说,路径是 C:/Users/Jennie/workspace/DataflowJavaSDK-master/eclipse/starter/target/classe‌​s/GeoLite2-City.mmdb,而在另一种情况下是 file:/dataflow/packages/staging/classes-WOdCPQCHjW-hRNtrfrnZMw.zip!/GeoLite2-City.mmdb)

我在网上搜索了您可能正在谈论的 DatabaseReader class,似乎是 https://github.com/maxmind/GeoIP2-java/blob/master/src/main/java/com/maxmind/geoip2/DatabaseReader.java

在这种情况下,您的代码很可能会通过以下较小的更改工作:

try
{
  InputStream stream = myClass.class.getResourceAsStream("/GeoLite2-City.mmdb");
  DatabaseReader reader = new DatabaseReader.Builder(stream).build();
}
catch (IOException e)
{
  ...
}