【问题标题】:BigQuery: Unrecognized timezone when importing CSVBigQuery:导入 CSV 时无法识别时区
【发布时间】:2018-08-01 17:30:33
【问题描述】:

CSV 文件加载到 BigQuery 时如何定义时间戳的时区

这些似乎都不起作用:

  • 2018-07-31 11:55:00 欧洲/罗马
  • 2018-07-31 11:55:00 CET

我收到以下错误:

{位置:“查询”;消息:“无法识别的时区:欧洲/罗马; 无法将“2018-07-31 11:55:00 Europe/Rome”解析为日期时间 字段 ts(位置 0)从位置 0 开始”;原因:“invalidQuery”}

我正在使用以下 Go 代码从 Google Cloud Storage 运行导入:

gcsRef := bigquery.NewGCSReference(gcsFilename)
gcsRef.SourceFormat = bigquery.CSV
gcsRef.FieldDelimiter = "|"
gcsRef.Schema = bigquery.Schema{
    {Name: "ts", Type: bigquery.TimestampFieldType},
    {Name: "field2", Type: bigquery.StringFieldType},
    {Name: "field3", Type: bigquery.StringFieldType},
}
loader := bigqueryClient.Dataset("events").Table("mytable").LoaderFrom(gcsRef)
loader.WriteDisposition = bigquery.WriteAppend

job, err := loader.Run(ctx)
if err != nil {
    log.Fatalln("loader.Run", err.Error())
}
status, err := job.Wait(ctx)
if err != nil {
    log.Fatalln("job.Wait", err.Error())
}
if status.Err() != nil {
    log.Fatalln("Job completed with error: %v", status.Err(), status.Errors)
}

【问题讨论】:

  • 在您的问题中您说您确实(至少听起来是这样)从 CSV 加载,但错误表明您实际上是在进行查询 - 请您澄清一下!同时您可以运行SELECT TIMESTAMP '2018-07-31 11:55:00 Europe/Rome', TIMESTAMP '2018-07-31 11:55:00 CET' 以确认两个时区都正确/有效
  • @MikhailBerlyant 我正在使用 Go 从 Google Cloud Storage 运行导入。我更新了我的问题,指定了我正在使用的代码。

标签: csv google-cloud-platform timezone timestamp google-bigquery


【解决方案1】:

为了让它工作 - 尝试将 ts 字段声明为字符串,然后您将能够在随后使用的任何查询中将其解析为时间戳 - 使用已经提到的(在评论中)方法 - 例如 SELECT TIMESTAMP(ts)

【讨论】:

  • 我想将该字段声明为TIMESTAMP,这样我就可以在该字段上自动对表进行分区。
  • 没有办法指定这样的时间戳是相对于不同于 UTC 的时区的吗?
  • 或者更好的解决方案是将该字段拆分为 2 个不同的字段:日期和时间?并使用日期作为分区字段?
  • 这应该可行 - 但在这种情况下,您的分区将不支持时区
  • 否则有没有办法(在数据加载期间)指定时间戳的时区?
猜你喜欢
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多