Google bigquery Google大查询存储API不一致地返回时区信息的FastAvro或Pytz

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

我使用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数据类型:

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