Loại JSON không có giản đồ thành Apache Beam "Row"?
Có cách nào để chuyển đổi các chuỗi JSON ít giản đồ tùy ý thành các loại Apache Beam "Row" bằng cách sử dụng Java SDK không? Nếu không, liệu có thể lấy kiểu Lược đồ tia từ một Đối tượng hiện có không?
Tôi đã tìm thấy tài liệu cho JsonToRow và ParseJsons , nhưng chúng yêu cầu cung cấp một lớp Schema hoặc POJO để hoạt động. Tôi cũng nhận thấy rằng bạn có thể đọc chuỗi JSON thành một BigQuery TableRow nhưng dường như không có cách nào để chuyển TableRow thành Row mà không liên quan đến việc đã có một lược đồ.
Trả lời
Không, điều này là không thể vì Row (và các khuôn khổ sử dụng nó) yêu cầu biết lược đồ tại thời điểm xây dựng. Tùy chọn là, tại thời điểm xây dựng, đọc một phần nhỏ dữ liệu của bạn để suy ra lược đồ của bạn và sử dụng nó để gọi biến đổi JsonToRow của bạn.
Thật không may, câu trả lời chung chung dường như là "không", mặc dù có một số tình huống cụ thể mà câu trả lời có thể là "có".
Vấn đề là các Lược đồ không tương thích 100% với các kiểu dữ liệu JSON, đặc biệt là do loại trường ARRAY .
Trong JSON, các phần tử của danh sách có thể có các kiểu dữ liệu khác nhau, nhưng các Lược đồ trong Beam yêu cầu mỗi phần tử phải thuộc ARRAY cùng một kiểu. Loại này có thể là một ROW khác, hoặc thậm chí là một loại logic , nhưng tất cả các phần tử phải giống nhau.
Rất tiếc, việc sử dụng ROW để thay thế ARRAY không hoàn toàn hoạt động. Mặc dù các trường ROW là vị trí, chúng cũng được đặt tên, làm cho chúng gần với MAP hơn. Hơn nữa, nếu tập dữ liệu của bạn chứa danh sách JSON có độ dài khác nhau, bạn sẽ kết thúc với việc mỗi Hàng có một Lược đồ khác nhau, điều này sẽ gây ra những hậu quả không mong muốn.
Vì vậy, nếu dữ liệu JSON của bạn không sử dụng danh sách các loại tùy ý, bạn sẽ ổn. Điều đó nói rằng, Beam không cung cấp bất kỳ tiện ích nào để lấy các lược đồ từ JSON, vì vậy bạn sẽ cần tự tạo giải pháp đó.
Tôi đang gặp phải tình huống chính xác này tại nơi làm việc và tôi thứ hai mọi thứ bạn đã nói về các tùy chọn xử lý JSON hạn chế. Hóa ra Beam cung cấp thứ gì đó có thể chuyển đổi BigQuery TableRow / TableSchema thành Beam Row / Schema . Nếu bạn chọn đó làm giản đồ của mình và tiếp tục với JsonToRow, bạn sẽ cần kết nối sự không khớp về trở kháng kiểu dữ liệu giữa các kiểu dữ liệu JSON và Beam do BigQueryUtils.fromTableSchema tạo ra (BYTES, DATETIME, các kiểu logic được tạo bởi BigQueryUtils ).