Lưu mảng <T> trong BigQuery bằng Java

Nov 26 2020

Tôi đang cố gắng lưu dữ liệu vào Truy vấn lớn bằng trình kết nối Spark Big Query. Giả sử tôi có một Java pojo như dưới đây

@Getter
@Setter
@AllArgsConstructor
@ToString
@Builder
public class TagList {
    private String s1;
    private List<String> s2;
}

Bây giờ khi tôi cố gắng lưu Pojo này vào truy vấn Lớn, nó sẽ khiến tôi gặp lỗi bên dưới

Caused by: com.google.cloud.spark.bigquery.repackaged.com.google.cloud.bigquery.BigQueryException: Failed to load to test_table1 in job JobId{project=<project_id>, job=<job_id>, location=US}. BigQuery error was Provided Schema does not match Table <Table_Name>. Field s2 has changed type from STRING to RECORD
    at com.google.cloud.spark.bigquery.BigQueryWriteHelper.loadDataToBigQuery(BigQueryWriteHelper.scala:156)
    at com.google.cloud.spark.bigquery.BigQueryWriteHelper.writeDataFrameToBigQuery(BigQueryWriteHelper.scala:89)
    ... 35 more

Mã mẫu:

Dataset<TagList> mapDS = inputDS.map((MapFunction<Row, TagList>) x -> {
                List<String> list = new ArrayList<>();
                list.add(x.get(0).toString());
                list.add("temp1");
return TagList.builder()
                    .s1("Hello World")
                    .s2(list).build();
        }, Encoders.bean(TagList.class));

        mapDS.write().format("bigquery")
                .option("temporaryGcsBucket","<bucket_name>")
                .option("table", "<table_name>")
                .option("project", projectId)
                .option("parentProject", projectId)
                .mode(SaveMode.Append)
                .save();

Bảng truy vấn lớn:

create table <dataset>.<table_name> (
  s1 string,
  s2 array<string>,
  )
  PARTITION BY
  TIMESTAMP_TRUNC(_PARTITIONTIME, HOUR);

Trả lời

DavidRabinowitz Nov 30 2020 at 18:59

Vui lòng thay đổi định dạng trung gian thành AVRO hoặc ORC. Khi sử dụng Sàn gỗ, việc tuần tự hóa tạo ra một cấu trúc trung gian. tìm hiểu thêm tạihttps://github.com/GoogleCloudDataproc/spark-bigquery-connector#properties