【问题标题】:How do I translate Datastore entity to BigQuery TableRow object in Java?如何在 Java 中将 Datastore 实体转换为 BigQuery TableRow 对象?
【发布时间】:2016-08-28 16:00:54
【问题描述】:

我有以下 DoFN 函数可以做到这一点,但没有我能找到有关它的问题的文档。

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

为非记录字段指定的 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);
    }
}

【问题讨论】:

  • 我刚刚找到了时间戳问题的解决方案:DateTime dateTime = new DateTime(props.get("timestamp").getTimestampMicrosecondsValue()/1000L); row.set("timestamp", ISODateTimeFormat.dateTime().print(dateTime)); 不知道应该如何构造时间戳以避免使用未知库。
  • 如果这解决了您的问题,请您将其发布为答案吗?

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


【解决方案1】:

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

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

时间戳的第二个问题:也有点不雅。我在文档中找不到任何地方,如何从 API 的角度(数据类型、字段长度、其格式等)格式化 Datastore 或 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 并将数据从一个地方移动到另一个地方的人。

【讨论】:

  • 这仍然是我能找到的从 Java 将毫秒值写入 BigQuery 的最佳方式。写java.util.Date 给你几秒钟,写一个long 给你微秒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
相关资源
最近更新 更多