使用Java Bigquery客户端API无法在BigQuery中写入日期

5

我正在从GCS中的CSV文件进行ETL到BQ,除了日期之外,一切都正常。我的表中字段名为TEST_TIME,类型为DATE,在TableRow中尝试传递java.util.Date、com.google.api.client.util.DateTime、String、以秒为单位的Long值,但都没有成功。
我收到了以下错误消息: 无法将非字符串JSON值转换为DATE类型。字段:TEST_TIME;值:...
使用DateTime时,我收到了以下错误: 指定非记录字段的JSON对象:TEST_TIME。

//tableRow.set("TEST_TIME", date);
//tableRow.set("TEST_TIME", new DateTime(date));
//tableRow.set("TEST_TIME", date.getTime()/1000);
//tableRow.set("TEST_TIME", dateFormatter.format(date)); //e.g. 05/06/2016
3个回答

6

我认为您需要按照 YYYY-MM-DD 的格式传递一个 String,这与您直接使用JSON调用REST API时类似。请尝试以下方法:

tableRow.set("TEST_TIME", "2017-04-06");

如果这样可以的话,你可以将你实际拥有的日期转换成这种格式,那么它也应该能够工作。


2
它起作用了...我错误地认为API会知道如何处理日期!有点令人失望。 - CCC

5

在使用Google Cloud Dataflow时,我使用了Google提供的时间戳包装器 - com.google.api.client.util.DateTime

在将行插入Big Query表时,这对我很有用。因此,我使用它来代替:

tableRow.set("TEST_TIME" , "2017-04-07");

我建议:
tableRow.set("TEST_TIME" , new DateTime(new Date()));

我认为这种做法比将时间戳作为字符串传递更加干净。


2
我已经这样做了,但我猜它只适用于TIMESTAMP类型,而不适用于DATE类型。 - CCC
2
@CCC 你是对的,对于时间戳 Unix 秒作为整数(1514800800),和字符串字面量也可以使用("2018-01-02 00:00:00"),对于仅日期的情况,只有字符串字面量("2018-01-02")可用。 - fpopic

1
使用Java类com.google.api.services.bigquery.model.TableRow,将毫秒数设置为UTC时间,并将其插入到BigQuery TIMESTAMP中,方法如下:
tableRow.set("timestamp", millisecondsSinceUTC / 1000.0d);

tableRow.set()函数需要一个浮点数,代表自UTC以来的秒数,精确到微秒。

这非常不标准且未经记录(set()将值封装在对象中,因此不清楚set()接受哪些数据类型。使用com.google.api.client.util.DateTime的其他提议解决方案对我无效。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接