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

Cannot write date in BigQuery using Java Bigquery Client API

我正在做一些从 GCS 中的 CSV 文件到 BQ 的 ETL,一切正常,除了日期。我的 table 中的字段名称是 TEST_TIME 并且类型是 DATE,所以在 TableRow 中我尝试传递一个 java.util.Date,一个 com.google.api.client.util.DateTime,一个字符串,一个长值秒数,但 none 有效。
我收到如下错误消息: 无法将非字符串 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

我认为您应该以 YYYY-MM-DD 格式传递 String,这类似于您直接使用 REST API 和 JSON.试试这个:

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

如果可行,那么您可以将实际日期转换为该格式,它也应该可行。

在使用 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()));

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

使用 Java class com.google.api.services.bigquery.model.TableRow,将自 UTC 以来的毫秒数设置为 BigQuery TIMESTAMP,执行以下操作:

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

tableRow.set() 需要一个浮点数,表示自 UTC 以来的 ,精度可达微秒。

非常 non-standard 且未记录(set() 将对象中的值装箱,因此不清楚 set() 接受什么数据类型。使用 com.google.api.client.util.DateTime 的其他建议解决方案不适用于我。)