如何在Java中将数据存储区实体转换为BigQuery TableRow对象?

时间:2016-08-28 16:00:55

标签: java google-app-engine google-cloud-dataflow

我有以下DoFN功能,但没有关于它的问题的文档。

  • 问题1是如何自动翻译密钥以便在BigQuery中构建它们的方式与导入表单数据存储备份文件时BigQuery的方式相同?
  • 问题2是如何处理时间戳?下面的代码通过以下消息打破了管道:
  

为非记录字段指定的JSON对象:timestamp

这是我写的代码:

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);
    }
}

1 个答案:

答案 0 :(得分:1)

我的期望是在辅助课中找到一些东西,但我没有成功。猜猜谷歌仍然在为他们的API增加新的位。也许在下一个版本中。 最大的问题是API有点不直观,与其他部分不一致。实体的密钥应该有它自己的访问器方法,而不必像这样挖掘祖先路径(获取路径数组的最后一个元素):

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

时间戳的第二个问题:也有点不雅。我在文档中找不到任何地方,如何从API的角度(数据类型,字段长度,格式等)格式化数据存储区或BigQuery中的时间戳。现在可以使用的解决方案需要第三方库(“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并将数据从一个地方移动到另一个地方。