我正在使用Java爲Pig編寫一個UDF。它工作正常,但豬不給我選擇分開環境。我的Pig腳本正在做的是從IP地址獲取地理位置。如何在Java項目中包含資源文件以便與新的File()一起使用?
這是我在地理位置部分的代碼。
private static final String GEO_DB = "GeoLite2-City.mmdb";
private static final String GEO_FILE = "/geo/" + GEO_DB;
public Map<String, Object> geoData(String ipStr) {
Map<String, Object> geoMap = new HashMap<String, Object>();
DatabaseReader reader = new DatabaseReader.Builder(new File(GEO_DB)).build();
// other stuff
}
GeoLite2-City.mmdb
存在HDFS,這就是爲什麼我可以使用/geo/GeoLite2-City.mmdb
絕對路徑參考。
但是,我不能這樣做,從我的JUnit測試或者我有我的本地機器和詹金斯這是不理想上創建/geo/GeoLite2-City.mmdb
。我試圖同時使用new File(GEO_DB)
想出一個辦法讓我的測試通過,不會 getClass().getResourceAsStream('./geo/GeoLite2-City.mmdb')
因爲
getClass().getResourceAsStream('./geo/GeoLite2-City.mmdb')
不Hadoop中工作。
如果我運行JUnit測試,因爲我沒有/geo/GeoLite2-City.mmdb
我的本地機器上做它會失敗。
有反正我能克服這個嗎?我只是想讓我的測試通過而不更改要使用的代碼getClass().getResourceAsStream
,而且我不能在其他地方使用它,因爲Pig沒有給我一種傳遞參數的方法,或者我錯過了一些東西。
這是我的JUnit測試
@Test
@Ignore
public void shouldGetGeoData() throws Exception {
String ipTest = "128.101.101.101";
Map<String, Object> geoJson = new LogLine2Json().geoData(ipTest);
assertThat(geoJson.get("lLa").toString(), is(equalTo("44.9759")));
assertThat(geoJson.get("lLo").toString(), is(equalTo("-93.2166")));
}
這要是我讀了資源文件夾中的數據庫文件,它的工作原理。這就是爲什麼我有@Ignore
我同意你的觀點,但不幸的是。我曾嘗試過依賴注入,但Hadoop對於如何將代碼分發到不同的機器和JVM有點奇怪。有時候它會無緣無故地炸燬。 – toy
是的,「無理由的炸彈」可能會翻譯爲:你的代碼是越野車,但有一個競賽條件;因此它'只是偶爾'炸彈',所以更好的理由是試圖通過單元測試來獲得「全面覆蓋」,而且你知道,依賴注入(可以)歸結爲一個僅用於測試的構造函數更多的參數,如果這會'炸彈'你的應用程序......那麼,正如所說:也許有一個很好的理由。 – GhostCat