У меня есть работа в Dataflow импортировании данных из Bigtable в Bigquery с использованием встроенных API Dataflow для обоих. У меня есть два вопроса:Bigtable-BigQuery Импорт через DataFlow: 2 вопроса по разбиению таблиц и меток времени
Вопрос 1: Если исходные данные в один большой стол в Bigtable, как я могу разделить его на множество суб- или небольших таблиц в BigQuery динамически на основе, скажем, учитывая Bigtable row-key известен только во время выполнения?
код Java в DataFlow выглядит следующим образом:
p.apply(Read.from(CloudBigtableIO.read(config)))
.apply(ParDo.of(new SomeDoFNonBTSourceData()))
.apply(BigQueryIO.Write
.to(PROJ_ID + ":" + BQ_DataSet + "." + BQ_TableName)
.withSchema(schema)
.withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_TRUNCATE)
.withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_IF_NEEDED));
p.run();
Таким образом, поскольку BQ_TableName
должен подаваться на уровне кода, как я могу предоставить это программно на основе того, что видно внутри SomeDoFNonBTSourceData
, подобно диапазон значений текущего RowKey? Если RowKey является «ас», то TableA, если «DF», то TableB и т.д.
Вопрос 2: Что такое правильный способ экспортировать Bigtable Timestamp в BigQuery так, чтобы в конечном итоге восстановить его в удобной для восприятия человеком формате в BigQuery?
Функция processElement в DoFn выглядит следующим образом:
public void processElement(ProcessContext c)
{
String valA = new String(c.element().getColumnLatestCell(COL_FAM, COL_NAME).getValueArray());
Long timeStamp = c.element().getColumnLatestCell(COL_FAM, COL_NAME).getTimestamp();
tr.put("ColA", valA);
tr.put("TimeStamp",timeStamp);
c.output(tr);
}
И во время строительства трубопровода, установка BQ схемы для столбца TIMESTAMP выглядит следующим образом:
List<TableFieldSchema> fields = new ArrayList<>();
fields.add(new TableFieldSchema().setName("ColA").setType("STRING"));
fields.add(new TableFieldSchema().setName("TimeStamp").setType("TIMESTAMP"));
schema = new TableSchema().setFields(fields);
Так Bigtable метка времени похоже, имеет тип Long
, и я пробовал как "TIMESTAMP"
, так и "INTEGER"
типов для столбца TimeStamp назначения в BQ (похоже, что в BQ как таковой нет). В конечном счете, мне нужно использовать столбец TimeStamp в BQ как для предложений «по порядку», так и для отображения информации в удобочитаемой форме (дата и время). Похоже, что часть «порядок» работает нормально, но мне не удалось выполнить конечный результат в любом значении - либо получить ошибки при запуске, либо что-то еще нечитаемое.
К сожалению, какой тип Date является то, что там? java.util.Date, похоже, не имеет .toInstant() 'и Date из API Google не содержит некоторых других методов? –
Не могли бы вы изменить свой языковой уровень на «8 - lambdas, аннотирование типа и т. Д.». В Intellij перейдите к структуре проекта, выберите свой модуль и измените уровень языка. Я не знаю, как это сделать в Eclipse. – Ken
ах вы правы - я вижу его там в документах. Должно быть, что-то с моим Eclipse. выяснит это. Я выложу здесь, если найду что-нибудь в вопросе 1 ... –