首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Google Big Query Storage API返回时区信息的FastAvro或Pytz不一致

Google Big Query Storage API返回时区信息的FastAvro或Pytz不一致
EN

Stack Overflow用户
提问于 2019-05-21 22:16:42
回答 1查看 134关注 0票数 0

我正在使用Python中的Big Query Storage API读取数据(google-cloud-bigquery-storage==0.4.0,今天也用0.5.0进行了检查)。

对于代码:

代码语言:javascript
复制
result = bq_client.query(sql, project=project).result()
return result.to_dataframe(bqstorage_client=bqs_client)

从一些查询中,SELECT-ing a TIMESTAMP列,我得到以下Pandas DataFrame数据类型:

datetime64[ns, <fastavro._timezone.UTCTzinfo object at 0x...>]

其中,时区信息以fastavro类型存储

对于其他表,我得到

datetime64[ns, UTC]

时区信息存储在pytz对象中。

据我所知(源表不在我的控制范围内,我不能使用公共数据集进行复制),这似乎是任意的--例如,添加limit子句会导致pytz输出--尽管总是与相同的查询保持一致。

有没有办法总是把pytz格式恢复过来?( avro TZ不可序列化,因此需要识别和转换)。

当会话到期时,这是否会恢复?(24小时?或者是否有可能强制会话结束?)

(不确定支持请求的最佳位置在哪里,但很欣赏Beta版的Big Query Storage API,所以在这里尝试一下。)

编辑:我目前正在通过这样做来解决这个问题

代码语言:javascript
复制
for col in train_df.select_dtypes('datetimetz'): 
    train_df[col] = train_df[col].dt.tz_convert(pytz.UTC)
EN

回答 1

Stack Overflow用户

发布于 2019-09-20 01:51:48

这看起来像是较新版本中修复的错误,可能与查询结果集中的日期溢出有关。

它看起来是一个关于处理溢出时间戳的剩余问题,根据数据集中的其他值(post的最后一行),这些时间戳的处理方式是不同的。

原始数据:

代码语言:javascript
复制
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的故意溢出

创建表:

代码语言:javascript
复制
bq mk -t chris.storage_api_test ts0:TIMESTAMP,ts1:TIMESTAMP
bq load chris.storage_api_test dates.csv

脚本(Python 3.6):

代码语言:javascript
复制
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)

使用BigQuery 1.12.1 / BQS 0.4.0

代码语言:javascript
复制
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

使用BigQuery 1.20.0 /BQS0.7.0

代码语言:javascript
复制
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

仍然存在的一个问题是,当在隔离(ts1)中使用溢出的时间戳时,我不会得到时间戳转换,当它使用另一个值(在表中)时,它会被转换为SELECTing。

我认为,考虑到二进制表示的差异(96和64位),这将始终是一个问题?尽管一致性可能会有所帮助。

谢谢你的回复,抱歉,这是一个冗长的回答/描述,这让人觉得这是一个微妙的问题?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56240285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档