[HADOOP] 잭슨 문제가있는 Hadoop Java MapReduce 구문 분석 JSON
HADOOP잭슨 문제가있는 Hadoop Java MapReduce 구문 분석 JSON
저는 Hadoop Java M / R 프로그램 (0.20.205)에서 Jackson JSON 파서 (1.9.5)를 사용하고 있습니다. 아래 JSON 예제를 보자.
{"id":23423423, "name":"abc", "location":{"displayName":"Florida, Rosario","objectType":"place"}, "price":1234.55}
자, 이제 id, location.displayName 및 price를 파싱하여 다음 Java 객체를 만들었으므로 원하지 않는 필드를 생략하고 싶다고 가정 해 보겠습니다.
@JsonIgnoreProperties(ignoreUnknown = true)
public class Transaction {
private long id;
private Location location;
private double price;
private static final ObjectMapper mapper = new ObjectMapper();
..setter/getter method would be here for id, Location, price
@JsonIgnoreProperties(ignoreUnknown = true)
public static class Location {
private String displayName;
public String getDisplayName { return displayName; }
public void setDisplayName(String displayName) { this.displayName = displayName; }
}
public static final Transaction fromJsonDoc(String jsonDoc) throws IOException {
JsonNode rootNode = mapper.readTree(jsonDoc);
return mapper.treeToValue(rootNode, Transaction.class);
}
}
이 프로그램을 독립 실행 형 모드로 실행할 때 (Hadoop 분산 모드가 아님). 내가 원하는 모든 필드는 올바르게 구문 분석됩니다. 그러나, 하둡지도 작업에서만 데이터를 파싱하자 마자 ID 필드와 location.displayName 및 price (비 직렬화되지 않고 null 임) 만 가져옵니다. MapReduce에서 실행할 때 @JsonIgnoreProperties (ignoreUnknown = true) 주석이 어떻게 든 작동하지 않는 것으로 보이고 원하는 필드가 deserialize되지 않습니다 (ID 이후의 모든 항목이 null 임). 모든 필드와 getter 및 setter를 Transaction 객체에 추가하고 @JsonIgnoreProperties를 제거하면 모든 것이 잘 동작합니다. 누구에게 이런 일이 발생했는지 제안 해 줍니까? 방금 예제를 들었지만 실제 JSON 문서는 매우 복잡하므로 모든 필드를 deserialize하고 싶지 않습니다. 내가 여기서 뭔가 잘못하고있는거야?
이것이 내가 Jackson을 main method와 Java / Map reduce program에서 사용하는 방법이다.
Transaction tran = Transaction.fromJsonDoc(jsonRec);
System.out.println("id: " + tran.getId()); //works in both
System.out.println("location: " + tran.getLocation().getDisplayName()); //works only in standalone execution but not in Map/Reduce
해결법
-
==============================
1.이는 클래스 로딩 문제로 인한 것일 수 있습니다 : 구버전의 jackson core 정도. 클래스 로딩과 주석을 다루는 까다로운 부분은 VM이 인식하지 못하는 주석을 삭제할 수 있다는 것입니다. 이것이 당신의 문제를 일으킬 수 있는지는 모르겠지만 점검할만한 가치가있을 것입니다. Hadoop은 다소 오래된 버전의 Jackson (1.1?)을 번들로 사용했고, 1.4에서 @JsonIgnoreProperties가 추가되었으므로 문제를 설명 할 수 있습니다.
이는 클래스 로딩 문제로 인한 것일 수 있습니다 : 구버전의 jackson core 정도. 클래스 로딩과 주석을 다루는 까다로운 부분은 VM이 인식하지 못하는 주석을 삭제할 수 있다는 것입니다. 이것이 당신의 문제를 일으킬 수 있는지는 모르겠지만 점검할만한 가치가있을 것입니다. Hadoop은 다소 오래된 버전의 Jackson (1.1?)을 번들로 사용했고, 1.4에서 @JsonIgnoreProperties가 추가되었으므로 문제를 설명 할 수 있습니다.
어떻게 될 수 있습니까? 최신 버전 (주석을 보려면)을 사용하여 컴파일해야하지만, 런타임 환경은 이전 (1.1) 버전을 사용하고있을 수 있습니다. 코드에서 주석 클래스를 적극적으로 사용하지 않기 때문에 (클래스와 연관된 "유일한") 클래스 로더는이 주석을 jar에서 찾을 수 없으므로이 주석을 삭제합니다.
from https://stackoverflow.com/questions/9724868/hadoop-java-mapreduce-parsing-json-with-jackson-issues by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] sqloop을 사용하여 하이브에 외부 테이블을 만드는 법. 제안 필요 (0) | 2019.07.31 |
---|---|
[HADOOP] Hadoop : 한 쌍의 값을 '키'로 사용할 수 있습니까? (0) | 2019.07.31 |
[HADOOP] SparkSQL + Hive + Hbase + HbaseIntegration이 작동하지 않습니다. (0) | 2019.07.31 |
[HADOOP] HDFS에서 파일을 업데이트하는 방법 (0) | 2019.07.31 |
[HADOOP] 다른 파일의 한 파일에서 단어를 검색하는 Hadoop (0) | 2019.07.31 |