2016-08-28 2 views
1

У меня есть следующая функция DoFN, но это не документация вопросов, которые я мог бы найти об этом.Как преобразовать объект Datastore в объект BigQuery TableRow в Java?

  • Проблема № 1 - как я могу автоматически переводить ключи, чтобы они были построены в BigQuery так же, как это делает BigQuery при импорте файла резервной копии Datastore?
  • Проблема № 2 - как обрабатывать временные метки? Приведенный ниже код разбивает трубопровод следующим сообщением:

JSON объект установленное для поля записи: метка времени

Вот код, я написал:

public class SensorObservationEntityToRowFn extends DoFn<Entity, TableRow> { 
    /** 
    * In this example, put the whole string into single BigQuery field. 
    */ 
    @Override 
    public void processElement(ProcessContext c) { 
     Map<String, Value> props = getPropertyMap(c.element()); 
     TableRow row = new TableRow(); 
     row.set("id", c.element().getKey().getPathElement(c.element().getKey().getPathElementCount()-1).getId()); 
     if (
       props.get("property1") != null && 
       props.get("property2") != null 
       ) { 
      // Map data from the source Entity to the destination TableRow 
      row.set("property1", props.get("property1").getStringValue()); 
      row.set("property2", props.get("property2").getStringValue()); 
     } 
     row.set("source_type", props.get("source_type").getStringValue()); 
     DateTime dateTime = new DateTime(props.get("timestamp").getTimestampMicrosecondsValue()/1000L); 
     row.set("timestamp", dateTime); 
     // Output new TableRow only if all data is present in the source 
     c.output(row); 
    } 
} 
+0

Я только что нашел решение проблемы временной метки: 'DateTime DateTime = новый DateTime; (props.get ("метки времени") getTimestampMicrosecondsValue()/1000L.) row.set («timestamp», ISODateTimeFormat.dateTime(). Print (dateTime)); ' Не знаю, как создать временную метку, чтобы избежать использования неизвестных библиотек. –

+0

Если это решит вашу проблему, не могли бы вы разместить ее в качестве ответа, пожалуйста? –

ответ

1

Мои ожидания было найти что-то в вспомогательных классах, но я не увенчался успехом. Угадайте, что Google по-прежнему добавляет новые биты в свои API. Может быть, в следующей версии. Самая большая проблема заключается в том, что API немного не интуитивно понятен и несовместим с другими частями. Ключ объекта должен иметь свой собственный акцесор вместо того, чтобы копаться в пути предка, как это (получить последний элемент массива пути):

getKey().getPathElement(c.element().getKey().getPathElementCount()-1).getId() 

Второй проблема с временными метками: немного unelegant а. Я не мог найти нигде в документации, как форматировать временную метку в Datastore или BigQuery с точки зрения API (тип данных, длина поля, его формат и т. Д.). Решение, которое сейчас работает, требует библиотеки сторонних разработчиков («joda»):

import org.joda.time.DateTime; 
import org.joda.time.format.ISODateTimeFormat; 

И перевод данных ниже. Вы должны помнить, что он находится в миллисекундах в одном месте и в микросекундах в другом. Еще одна ненужная путаница.

DateTime dateTime = new DateTime(props.get("timestamp").getTimestampMicrosecondsValu‌​e()/1000L); 

row.set("timestamp", ISODateTimeFormat.dateTime().print(dateTime)); 

Надеюсь, это поможет другим людям работать с Dataflow и перемещать данные из одного места в другое.