스키마없는 JSON에서 Apache Beam '행'유형으로?
자바 SDK를 사용하여 임의의 스키마없는 JSON 문자열을 Apache Beam 'Row'유형 으로 변환하는 방법이 있나요? 그렇지 않은 경우 기존 객체에서 빔 스키마 유형을 파생 할 수 있습니까?
JsonToRow 및 ParseJsons에 대한 설명서를 찾았 지만 작동하려면 Schema 또는 POJO 클래스가 제공되어야합니다. 또한 JSON 문자열을 BigQuery TableRow 로 읽을 수 있지만 TableRow를 스키마가없는 행으로 변환하는 방법은없는 것 같습니다.
답변
아니요, Row (및이를 사용하는 프레임 워크)는 생성시 스키마를 알아야하기 때문에 불가능합니다. On 옵션은 생성시 데이터의 작은 부분을 읽고 스키마를 추론하고이를 사용하여 JsonToRow 변환을 호출하는 것입니다.
안타깝게도 일반적인 대답은 "아니오"로 보이지만 대답이 "예"일 수있는 특정 상황이 있습니다.
문제는 스키마가 특히 ARRAY 필드 유형으로 인해 JSON 데이터 유형과 100 % 호환되지 않는다는 것 입니다.
JSON에서 목록의 요소는 다른 데이터 유형을 가질 수 있지만 Beam의 스키마에서는 각 요소가 동일한 유형 의 ARRAY 여야합니다 . 이 유형은 다른 ROW 또는 논리 유형일 수 있지만 모든 요소는 동일해야합니다.
불행히도 ROW를 사용하여 ARRAY를 대체하는 것은 완전히 작동하지 않습니다. ROW 필드는 위치가 지정되지만 이름도 지정되어 MAP에 더 가깝습니다. 또한 데이터 세트에 길이가 다른 JSON 목록이 포함되어 있으면 각 행에 다른 스키마가 포함되어 바람직하지 않은 결과가 발생합니다.
따라서 JSON 데이터가 임의 유형의 목록을 사용하지 않는 경우 괜찮습니다. 즉, Beam은 JSON에서 스키마를 파생하기위한 유틸리티를 제공하지 않으므로 해당 솔루션을 직접 만들어야합니다.
저는 직장에서이 정확한 상황에 직면하고 있으며 제한된 JSON 처리 옵션에 대해 당신이 말한 모든 것을 두 번째로 생각합니다. Beam은 BigQuery TableRow / TableSchema를 Beam Row / Schema로 변환 할 수있는 기능을 제공합니다 . 이를 스키마로 선택하고 JsonToRow를 진행하는 경우 BigQueryUtils.fromTableSchema에서 생성 된 JSON과 Beam 데이터 유형 (BYTES, DATETIME, BigQueryUtils에서 생성 된 논리적 유형) 간의 데이터 유형 임피던스 불일치를 연결해야합니다 .