Google bigquery Google大查询存储API不一致地返回时区信息的FastAvro或Pytz
我使用Python中的大查询存储API读取数据google cloud bigquery Storage==0.4.0,今天也使用0.5.0进行了检查 守则:Google bigquery Google大查询存储API不一致地返回时区信息的FastAvro或Pytz,google-bigquery,Google Bigquery,我使用Python中的大查询存储API读取数据google cloud bigquery Storage==0.4.0,今天也使用0.5.0进行了检查 守则: result = bq_client.query(sql, project=project).result() return result.to_dataframe(bqstorage_client=bqs_client) 从一些查询中,选择Ining a TIMESTAMP column,我得到以下DataFrame数据类型: dat
result = bq_client.query(sql, project=project).result()
return result.to_dataframe(bqstorage_client=bqs_client)
从一些查询中,选择Ining a TIMESTAMP column,我得到以下DataFrame数据类型:
datetime64[ns,]
其中时区信息存储在fastavro类型中
对于其他的桌子,我可以
日期时间64[ns,UTC]
使用pytz对象中存储的时区信息
据我所知,源表超出了我的控制范围,并且我无法使用公共数据集进行复制,这似乎是任意的—例如,在pytz输出中添加一个limit子句—尽管始终使用相同的查询
有没有一种方法可以始终恢复pytz格式?avro TZ不可序列化,因此需要识别和转换
这是会话过期时将恢复的内容吗?24小时?或者是否有可能强制一个会话结束
不确定支持请求的最佳位置在哪里,请欣赏Big Query Storage API的测试版,因此请在此处尝试
编辑:
我目前正在通过以下方式解决此问题:
for col in train_df.select_dtypes('datetimetz'):
train_df[col] = train_df[col].dt.tz_convert(pytz.UTC)
这看起来像是更新版本中修复的错误,可能与查询结果集中的日期溢出有关 看起来还有一个关于处理溢出时间戳的问题,根据文章最后一行数据集中的其他值,处理溢出时间戳的方式有所不同 原始数据:
2019-09-01T12:34:56.123456789,2019-09-01T12:34:56.123456789Z
2019-09-02T12:34:56.123456789,3019-09-01T12:34:56.123456789Z
3019-09-01日期是numpy datetime64故意溢出的日期
创建表:
bq mk -t chris.storage_api_test ts0:TIMESTAMP,ts1:TIMESTAMP
bq load chris.storage_api_test dates.csv
脚本Python 3.6:
from google.cloud import bigquery
from google.cloud import bigquery_storage
import pandas as pd
bq_client, bqs_client = bigquery.Client(), bigquery_storage.BigQueryStorageClient()
PROJ = '<PROJECT>'
TABLE = 'chris.storage_api_test'
print("BigQuery Version", bigquery.__version__)
print("="*20, "Table", "="*20)
table = bigquery.TableReference.from_string(f'{PROJ}.{TABLE}')
rows = bq_client.list_rows(table)
df = rows.to_dataframe(bqstorage_client=bqs_client)
print(df.dtypes)
print(df)
print("="*20, "ts0", "="*20)
query = f"select ts0 from {PROJ}.{TABLE}"
result = bq_client.query(query).result()
df = result.to_dataframe(bqstorage_client=bqs_client)
print(df.dtypes)
print(df)
print("="*20, "ts1", "="*20)
query = f"select ts1 from {PROJ}.{TABLE}"
result = bq_client.query(query).result()
df = result.to_dataframe(bqstorage_client=bqs_client)
print(df.dtypes)
print(df)
剩下的一个问题是,在隔离ts1中选择溢出时间戳时,我没有得到时间戳转换,当它与表中的另一个值一起时,它被转换为datetime
我认为,考虑到二进制表示96位与64位之间的差异,这将始终是一个问题?尽管一致性可能会有所帮助
感谢您的回复,很抱歉,这是一个冗长的回答/描述,这有助于了解什么感觉像是一个微妙的问题?嗨,我有一些与您的询问相关的问题:1。您能否提供一个示例查询,从哪里获得fastavro类型,从哪里获得pytz?2.您是否100%肯定所有要查询的字段都是BigQuery中的TIMESTAMP类型?3.我注意到这篇文章有点老了,从那以后你试过更新版本吗?1.19.0刚刚发布。此外,测试版功能实际上不受GCP支持的SLA支持,因此,如果您目前正在免费试用或拥有付费支持包,您可以打开一个支持案例。嗨,Chu_mike,谢谢您的评论!是的,这似乎在新版本中得到了修复,我将在下面添加一条注释和一些代码。我认为这很难重新创建,几周后,它最终被证明与数据中的错误有关,时间戳在Python中有一个日期溢出,BQ使用96位,datetime在数百万行中使用64位,这就是为什么我不能真正发布一个示例的原因。
Table -> FastAvro 'error' and String column
ts0 only -> datetime64[ns, pytz.UTC]
ts1 only -> String
BigQuery Version 1.12.1
==================== Table ====================
ts0 datetime64[ns, <fastavro._timezone.UTCTzinfo o...
ts1 object
dtype: object
ts0 ts1
0 2019-09-01 12:34:56.123456+00:00 2019-09-01 12:34:56.123456+00:00
1 2019-09-02 12:34:56.123456+00:00 3019-09-01 12:34:56.123455+00:00
==================== ts0 ====================
ts0 datetime64[ns, UTC]
dtype: object
ts0
0 2019-09-01 12:34:56.123456+00:00
1 2019-09-02 12:34:56.123456+00:00
==================== ts1 ====================
ts1 object
dtype: object
ts1
0 2019-09-01 12:34:56.123456+00:00
1 3019-09-01 12:34:56.123456+00:00
Table -> datetime64 (with overflowed timestamp)
ts0 only -> datetime64[ns, pytz.UTC]
ts1 only -> String
BigQuery Version 1.20.0
==================== Table ====================
ts0 datetime64[ns, UTC]
ts1 datetime64[ns, UTC]
ts0 ts1
0 2019-09-01 12:34:56.123456+00:00 2019-09-01 12:34:56.123456+00:00
1 2019-09-02 12:34:56.123456+00:00 1850-07-23 13:25:48.704352768+00:00
==================== ts0 ====================
ts0 datetime64[ns, UTC]
ts0
0 2019-09-01 12:34:56.123456+00:00
1 2019-09-02 12:34:56.123456+00:00
==================== ts1 ====================
ts1 object
ts1
0 2019-09-01 12:34:56.123456+00:00
1 3019-09-01 12:34:56.123456+00:00