스키마없는 JSON에서 Apache Beam '행'유형으로?

Aug 18 2020

자바 SDK를 사용하여 임의의 스키마없는 JSON 문자열을 Apache Beam 'Row'유형 으로 변환하는 방법이 있나요? 그렇지 않은 경우 기존 객체에서 빔 스키마 유형을 파생 할 수 있습니까?

JsonToRow 및 ParseJsons에 대한 설명서를 찾았 지만 작동하려면 Schema 또는 POJO 클래스가 제공되어야합니다. 또한 JSON 문자열을 BigQuery TableRow 로 읽을 수 있지만 TableRow를 스키마가없는 행으로 변환하는 방법은없는 것 같습니다.

답변

2 robertwb Aug 21 2020 at 07:10

아니요, Row (및이를 사용하는 프레임 워크)는 생성시 스키마를 알아야하기 때문에 불가능합니다. On 옵션은 생성시 데이터의 작은 부분을 읽고 스키마를 추론하고이를 사용하여 JsonToRow 변환을 호출하는 것입니다.

2 Mr.Llama Aug 22 2020 at 02:03

안타깝게도 일반적인 대답은 "아니오"로 보이지만 대답이 "예"일 수있는 특정 상황이 있습니다.

문제는 스키마가 특히 ARRAY 필드 유형으로 인해 JSON 데이터 유형과 100 % 호환되지 않는다는 것 입니다.
JSON에서 목록의 요소는 다른 데이터 유형을 가질 수 있지만 Beam의 스키마에서는 각 요소가 동일한 유형 의 ARRAY 여야합니다 . 이 유형은 다른 ROW 또는 논리 유형일 수 있지만 모든 요소는 동일해야합니다.
불행히도 ROW를 사용하여 ARRAY를 대체하는 것은 완전히 작동하지 않습니다. ROW 필드는 위치가 지정되지만 이름도 지정되어 MAP에 더 가깝습니다. 또한 데이터 세트에 길이가 다른 JSON 목록이 포함되어 있으면 각 행에 다른 스키마가 포함되어 바람직하지 않은 결과가 발생합니다.

따라서 JSON 데이터가 임의 유형의 목록을 사용하지 않는 경우 괜찮습니다. 즉, Beam은 JSON에서 스키마를 파생하기위한 유틸리티를 제공하지 않으므로 해당 솔루션을 직접 만들어야합니다.

1 user2910265 Jan 08 2021 at 11:20

저는 직장에서이 정확한 상황에 직면하고 있으며 제한된 JSON 처리 옵션에 대해 당신이 말한 모든 것을 두 번째로 생각합니다. Beam은 BigQuery TableRow / TableSchema를 Beam Row / Schema로 변환 할 수있는 기능을 제공합니다 . 이를 스키마로 선택하고 JsonToRow를 진행하는 경우 BigQueryUtils.fromTableSchema에서 생성 된 JSON과 Beam 데이터 유형 (BYTES, DATETIME, BigQueryUtils에서 생성 된 논리적 유형) 간의 데이터 유형 임피던스 불일치를 연결해야합니다 .