【问题标题】:Cannot write date in BigQuery using Java Bigquery Client API无法使用 Java Bigquery Client API 在 BigQuery 中写入日期
【发布时间】:2017-09-01 18:26:27
【问题描述】:

我正在从 GCS 中的 CSV 文件到 BQ 做一些 ETL,一切正常,除了日期。我的表中的字段名称是 TEST_TIME,类型是 DATE,所以在 TableRow 中我尝试传递一个 java.util.Date、一个 com.google.api.client.util.DateTime、一个字符串、一个带数字的 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

【问题讨论】:

  • 您的声誉得分较低。除了接受答案之外,vote on answer 也很重要。投票选出有帮助的答案。 ...您可以检查当有人回答您的问题时该怎么做 - stackoverflow.com/help/someone-answers。遵循这些简单的规则,您可以提高自己的声誉得分,同时让我们有动力回答您的问题:o) 请考虑!

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


【解决方案1】:

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

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

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

【讨论】:

  • 它起作用了...我的错误印象是 API 会知道如何处理日期!有点令人失望。
【解决方案2】:

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

在将行插入 Big Query 表时,这对我有用。所以,而不是

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

我会推荐

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

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

【讨论】:

  • 我这样做了,但我猜它只适用于 TIMESTAMP 类型,不适用于 DATE 类型。
  • @CCC 你是对的,对于时间戳 unix 秒,整数(1514800800)有效,字符串文字也有效(“2018-01-02 00:00:00”),仅日期字符串文字( "2018-01-02") 作品
【解决方案3】:

使用 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 的另一个建议解决方案没有为我工作。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2020-03-31
    • 2022-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多