Bigquery 无法将输入字符串解析为 TIMESTAMP
Bigquery failed to parse input string as TIMESTAMP
我正在尝试使用架构自动检测将 Google 云存储中的 csv 加载到 Bigquery 中。
但是,我的其中一个专栏出现解析错误,这让我很为难。我很困惑为什么 bigquery 无法解析该字段。在 the documentation 中,它应该能够解析看起来像 YYYY-MM-DD HH:MM:SS.SSSSSS
的字段(这正是我的 BQInsertTimeUTC 列)。
这是我的代码:
from google.cloud import bigquery
from google.oauth2 import service_account
project_id = "<my_project_id>"
table_name = "<my_table_name>"
gs_link = "gs://<my_bucket_id>/my_file.csv"
creds = service_account.Credentials.from_service_account_info(gcs_creds)
bq_client = bigquery.Client(project=project_id, credentials=creds)
dataset_ref = bq_client.dataset(<my_dataset_id>)
# create job_config object
job_config = bigquery.LoadJobConfig(
autodetect=True,
skip_leading_rows=1,
source_format="CSV",
write_disposition="WRITE_TRUNCATE",
)
# prepare the load_job
load_job = bq_client.load_table_from_uri(
gs_link,
dataset_ref.table(table_name),
job_config=job_config,
)
# execute the load_job
result = load_job.result()
错误信息:
Could not parse '2021-07-07 23:10:47.989155' as TIMESTAMP for field BQInsertTimeUTC (position 4) starting at location 64 with message 'Failed to parse input string "2021-07-07 23:10:47.989155"'
这是 GCS 中的 csv 文件:
first_name, last_name, date, number_col, BQInsertTimeUTC, ModifiedBy
lisa, simpson, 1/2/2020T12:00:00, 2, 2021-07-07 23:10:47.989155, tim
bart, simpson, 1/2/2020T12:00:00, 3, 2021-07-07 23:10:47.989155, tim
maggie, simpson, 1/2/2020T12:00:00, 4, 2021-07-07 23:10:47.989155, tim
marge, simpson, 1/2/2020T12:00:00, 5, 2021-07-07 23:10:47.989155, tim
homer, simpson, 1/3/2020T12:00:00, 6, 2021-07-07 23:10:47.989155, tim
根据此处提到的限制,
加载 JSON 或 CSV 数据时,TIMESTAMP
列中的值必须使用破折号 -
分隔符作为时间戳的日期部分,并且日期必须在以下格式:YYYY-MM-DD
(年-月-日)。时间戳的 hh:mm:ss
(小时-分钟-秒)部分必须使用冒号 :
分隔符。
那么你可以尝试将 BQInsertTimeUTC
作为 2021-07-07 23:10:47
而不是毫秒而不是 2021-07-07 23:10:47.989155
如果您仍想使用不同的日期格式,您可以执行以下操作:
- 按原样将 CSV 文件加载到 BigQuery(即您的架构应修改为
BQInsertTimeUTC:STRING
)
- 创建一个 BigQuery 视图,将 shipped 字段从字符串转换为可识别的日期格式。
- 为
BQInsertTimeUTC
做一个 PARSE_DATE
并使用该视图进行分析
将 CSV 文件加载到 BigQuery 假定所有时间戳字段都将遵循相同的格式。在您的 CSV 文件中,由于第一个时间戳值是“1/2/2020T12:00:00”,因此它将考虑 CSV 文件使用的时间戳格式是 [M]M-[D]D-YYYYT[H]H:[M]M:[S]S[.F]][时区].
因此,它抱怨无法解析值“2021-07-07 23:10:47.989155”。如果将“2021-07-07 23:10:47.989155”更改为“7/7/2021T23:10:47.989155”,它将起作用。
要解决此问题,您可以
- 创建一个 table,日期列的类型和 BQInsertTimeUTC 列的类型为 STRING。将 CSV 加载到其中。然后公开一个视图,该视图将具有日期和 BQInsertTimeUTC 的预期 TIMESTAMP 列类型,使用 SQL 从基础 table.
转换数据
- 打开 CSV 文件并转换“日期”值或“BQInsertTimeUTC”值以使其格式一致。
顺便说一下,您在此处粘贴的 CSV 示例在分隔符“,”之后有额外的 space。
工作版本:
first_name,last_name,date,number_col,BQInsertTimeUTC,ModifiedBy
lisa,simpson,1/2/2020T12:00:00,7/7/2021T23:10:47.989155,tim
bart,simpson,1/2/2020T12:00:00,3,7/7/2021T23:10:47.989155,tim
maggie,simpson,1/2/2020T12:00:00,4,7/7/2021T23:10:47.989155,tim
marge,simpson,1/2/2020T12:00:00,5,7/7/2021T23:10:47.989155,tim
homer,simpson,1/3/2020T12:00:00,6,7/7/2021T23:10:47.989155,tim
我正在尝试使用架构自动检测将 Google 云存储中的 csv 加载到 Bigquery 中。
但是,我的其中一个专栏出现解析错误,这让我很为难。我很困惑为什么 bigquery 无法解析该字段。在 the documentation 中,它应该能够解析看起来像 YYYY-MM-DD HH:MM:SS.SSSSSS
的字段(这正是我的 BQInsertTimeUTC 列)。
这是我的代码:
from google.cloud import bigquery
from google.oauth2 import service_account
project_id = "<my_project_id>"
table_name = "<my_table_name>"
gs_link = "gs://<my_bucket_id>/my_file.csv"
creds = service_account.Credentials.from_service_account_info(gcs_creds)
bq_client = bigquery.Client(project=project_id, credentials=creds)
dataset_ref = bq_client.dataset(<my_dataset_id>)
# create job_config object
job_config = bigquery.LoadJobConfig(
autodetect=True,
skip_leading_rows=1,
source_format="CSV",
write_disposition="WRITE_TRUNCATE",
)
# prepare the load_job
load_job = bq_client.load_table_from_uri(
gs_link,
dataset_ref.table(table_name),
job_config=job_config,
)
# execute the load_job
result = load_job.result()
错误信息:
Could not parse '2021-07-07 23:10:47.989155' as TIMESTAMP for field BQInsertTimeUTC (position 4) starting at location 64 with message 'Failed to parse input string "2021-07-07 23:10:47.989155"'
这是 GCS 中的 csv 文件:
first_name, last_name, date, number_col, BQInsertTimeUTC, ModifiedBy
lisa, simpson, 1/2/2020T12:00:00, 2, 2021-07-07 23:10:47.989155, tim
bart, simpson, 1/2/2020T12:00:00, 3, 2021-07-07 23:10:47.989155, tim
maggie, simpson, 1/2/2020T12:00:00, 4, 2021-07-07 23:10:47.989155, tim
marge, simpson, 1/2/2020T12:00:00, 5, 2021-07-07 23:10:47.989155, tim
homer, simpson, 1/3/2020T12:00:00, 6, 2021-07-07 23:10:47.989155, tim
根据此处提到的限制,
加载 JSON 或 CSV 数据时,TIMESTAMP
列中的值必须使用破折号 -
分隔符作为时间戳的日期部分,并且日期必须在以下格式:YYYY-MM-DD
(年-月-日)。时间戳的 hh:mm:ss
(小时-分钟-秒)部分必须使用冒号 :
分隔符。
那么你可以尝试将 BQInsertTimeUTC
作为 2021-07-07 23:10:47
而不是毫秒而不是 2021-07-07 23:10:47.989155
如果您仍想使用不同的日期格式,您可以执行以下操作:
- 按原样将 CSV 文件加载到 BigQuery(即您的架构应修改为
BQInsertTimeUTC:STRING
) - 创建一个 BigQuery 视图,将 shipped 字段从字符串转换为可识别的日期格式。
- 为
BQInsertTimeUTC
做一个PARSE_DATE
并使用该视图进行分析
将 CSV 文件加载到 BigQuery 假定所有时间戳字段都将遵循相同的格式。在您的 CSV 文件中,由于第一个时间戳值是“1/2/2020T12:00:00”,因此它将考虑 CSV 文件使用的时间戳格式是 [M]M-[D]D-YYYYT[H]H:[M]M:[S]S[.F]][时区].
因此,它抱怨无法解析值“2021-07-07 23:10:47.989155”。如果将“2021-07-07 23:10:47.989155”更改为“7/7/2021T23:10:47.989155”,它将起作用。
要解决此问题,您可以
- 创建一个 table,日期列的类型和 BQInsertTimeUTC 列的类型为 STRING。将 CSV 加载到其中。然后公开一个视图,该视图将具有日期和 BQInsertTimeUTC 的预期 TIMESTAMP 列类型,使用 SQL 从基础 table. 转换数据
- 打开 CSV 文件并转换“日期”值或“BQInsertTimeUTC”值以使其格式一致。
顺便说一下,您在此处粘贴的 CSV 示例在分隔符“,”之后有额外的 space。
工作版本:
first_name,last_name,date,number_col,BQInsertTimeUTC,ModifiedBy
lisa,simpson,1/2/2020T12:00:00,7/7/2021T23:10:47.989155,tim
bart,simpson,1/2/2020T12:00:00,3,7/7/2021T23:10:47.989155,tim
maggie,simpson,1/2/2020T12:00:00,4,7/7/2021T23:10:47.989155,tim
marge,simpson,1/2/2020T12:00:00,5,7/7/2021T23:10:47.989155,tim
homer,simpson,1/3/2020T12:00:00,6,7/7/2021T23:10:47.989155,tim