我在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
答案 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的其他建议解决方案没有为我工作。)