无法使用Java Bigquery客户端API

时间:2017-04-06 15:49:22

标签: google-bigquery google-cloud-storage google-cloud-dataflow

我在GCS到BQ的CSV文件中做了一些ETL,一切正常,日期除外。我的表中的字段名是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 个答案:

答案 0 :(得分:4)

I think that you're expected to pass a String in the format YYYY-MM-DD, which is similar to if you were using the REST API directly with JSON. Try this:

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

If that works, then you can convert the actual date that you have to that format and it should also work.

答案 1 :(得分:1)

在使用Google云端数据流时,我使用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 :(得分:0)

使用Java类com.google.api.services.bigquery.model.TableRow设置自UTC到BigQuery TIMESTAMP以来的毫秒数:

tableRow.set("timestamp", millisecondsSinceUTC / 1000.0d);

tableRow.set()期望一个浮点数,表示自UTC以来的 seconds ,精度最高为微秒。

非常不标准且没有文档说明(set()的值将对象中的值装箱,因此尚不清楚set()接受哪种数据类型。使用com.google.api.client.util.DateTime的其他建议解决方案没有为我工作。)