Apache beam : Програмно създаване на разделени таблици

Пиша облачен поток от данни, който чете съобщения от Pubsub и ги съхранява в BigQuery. Искам да използвам разделена таблица (по дата) и използвам Timestamp, свързан със съобщението, за да определя в кой дял трябва да влезе съобщението. По-долу е моят код:

      BigQueryIO.writeTableRows()
        .to(new SerializableFunction<ValueInSingleWindow<TableRow>, TableDestination>() {
            private static final long serialVersionUID = 1L;

            @Override
              public TableDestination apply(ValueInSingleWindow<TableRow> value) {
                log.info("Row value : {}", value.getValue());
                Instant timestamp = value.getTimestamp();
                String partition = DateTimeFormat.forPattern("yyyyMMdd").print(timestamp);
                TableDestination td = new TableDestination(
                    "<project>:<dataset>.<table>" + "$" + partition, null);
                log.info("Table Destination : {}", td);
                return td;
              }
          })            
    .withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_IF_NEEDED)         
    .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND) 
    .withSchema(tableSchema);

Когато разположа потока от данни, мога да видя отчетите за регистрационни файлове в Stackdriver, но съобщенията не се вмъкват в таблиците на BigQuery и получавам следната грешка:

Request failed with code 400, will NOT retry: https://www.googleapis.com/bigquery/v2/projects/<project_id>/datasets/<dataset_id>/tables
severity:  "WARNING"  

Така че изглежда, че не е в състояние да създаде таблица, което води до грешка при вмъкване. Трябва ли да променя дефиницията на потока от данни, за да може това да работи? Ако не, има ли друг начин за програмно създаване на разделените таблици?

Използвам Apache beam 2.0.0.


person Darshan Mehta    schedule 31.10.2017    source източник


Отговори (1)


Това беше бъг в BigQueryIO и беше коригиран в Beam 2.2. Можете да използвате версия на моментна снимка на Beam или да изчакате, докато версия 2.2 бъде финализирана (процесът на пускане в момента е в ход).

person jkff    schedule 31.10.2017
comment
благодаря за актуализацията. Няколко последващи въпроса (съжалявам): 1. Има ли друг начин за създаване на таблици в потока на данни (освен чрез използване на apache beam) и 2. Кога очакваме да бъде пуснат beam 2.2? - person Darshan Mehta; 31.10.2017
comment
Можете да създавате таблици, като използвате директно BigQuery API cloud.google.com/bigquery/docs/ справочници/библиотеки . Освобождаването на Beam е процес на общността на Apache, така че не може да има твърди гаранции, но според мен изглежда вероятно да се случи през следващата седмица или две. Можете да следвате темата lists.apache.org/ thread.html/ - person jkff; 01.11.2017
comment
Благодаря за вашия принос @jkff. - person Darshan Mehta; 02.11.2017
comment
Библиотеката е надстроена до 2.2.0. Сега получаваме следната грешка със същия код: Cannot read partition information from a table that is not partitioned:. И така, изглежда, че създава таблица без дял? - person Darshan Mehta; 19.01.2018
comment
Бихте ли споделили пълното проследяване на стека на грешката и идентификационния номер на заданието на потока от данни? - person jkff; 20.01.2018