无法使用Java Bigquery Client API在BigQuery中写日期

CCC*_*CCC 4 google-cloud-storage google-bigquery google-cloud-dataflow

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

//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
Run Code Online (Sandbox Code Playgroud)

Ell*_*ard 5

我认为您应该以String格式传递YYYY-MM-DD,这与您直接将REST API与JSON一起使用时类似。尝试这个:

tableRow.set("TEST_TIME", "2017-04-06");
Run Code Online (Sandbox Code Playgroud)

如果可行,则可以将实际的日期转换为该格式,并且它也应该有效。

  • 它起作用了……我对API知道如何处理日期有一种错误的印象!有点令人失望。 (2认同)

Par*_*osh 5

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

在将行插入大查询表时,这对我有用。所以,而不是

tableRow.set("TEST_TIME" , "2017-04-07");
Run Code Online (Sandbox Code Playgroud)

我会推荐

tableRow.set("TEST_TIME" , new DateTime(new Date()));
Run Code Online (Sandbox Code Playgroud)

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

  • 我这样做了,但我想它仅适用于 TIMESTAMP 类型,不适用于 DATE 类型。 (2认同)
  • @CCC你是对的,对于时间戳unix秒作为整数(1514800800)有效,字符串文字也有效(“2018-01-02 00:00:00”),对于仅日期字符串文字(“2018-01-02”)作品 (2认同)