我有以下DoFN功能,但没有关于它的问题的文档。
为非记录字段指定的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);
}
}
答案 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").getTimestampMicrosecondsValue()/1000L);
row.set("timestamp", ISODateTimeFormat.dateTime().print(dateTime));
希望这有助于其他人使用Dataflow并将数据从一个地方移动到另一个地方。