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

5 人关注

我正在做一些ETL,从GCS中的CSV文件到BQ,一切都很好,除了日期问题。我的表的字段名是TEST_TIME,类型是DATE,所以在TableRow中我试着传递一个java.util.Date,一个com.google.api.client.util.DateTime,一个String,一个带秒数的Long值,但都没有成功。 我得到的错误信息是这样的。 无法将非字符串的JSON值转换为DATE类型。字段。TEST_TIME; Value: ... 当使用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
    
google-bigquery
google-cloud-storage
google-cloud-dataflow
CCC
CCC
发布于 2017-04-06
3 个回答
Paritosh
Paritosh
发布于 2017-04-07
0 人赞同

在使用谷歌云数据流时,我使用了谷歌的时间戳包装器 - com.google.api.client.util.DateTime

在向Big Query表插入行时,这对我来说很有效。因此,我建议使用

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

我建议使用

tableRow.set("TEST_TIME" , new DateTime(new Date()));

我发现这比把时间戳作为一个字符串传递要干净得多。

CCC
我这样做了,但我猜它只对TIMESTAMP类型有效,对DATE类型无效。
@CCC 你是对的,对于时间戳,unix秒的整数(1514800800)可以工作,字符串字面也可以("2018-01-02 00:00:00"),对于日期只有字符串字面("2018-01-02")可以工作
DoomGoober
DoomGoober
发布于 2017-04-07
0 人赞同

使用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,但对我来说不起作用。)

Elliott Brossard
Elliott Brossard
发布于 2017-04-07
已采纳
0 人赞同

我认为你应该传递一个 String ,格式为 YYYY-MM-DD ,这与你直接使用REST API的JSON类似。试试这个。