如何读取资源文件? (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/classes/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)
{
...
}
我的 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/classes/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)
{
...
}