将集合列表转换为列
Converting List of Sets to Columns
我用 Python 从 BigQyery 中提取了一个 SQL 查询结果,并将结果存储在数据框中,其中一个字段 event_params
已保存为集合列表如下
[{'key': 'update_with_analytics', 'value': {'string_value': None, 'int_value': 0.0, 'float_value': None, 'double_value': None}}
{'key': 'firebase_event_origin', 'value': {'string_value': 'auto', 'int_value': None, 'float_value': None, 'double_value': None}}
{'key': 'firebase_conversion', 'value': {'string_value': None, 'int_value': 1.0, 'float_value': None, 'double_value': None}}
{'key': 'previous_first_open_count', 'value': {'string_value': None, 'int_value': 0.0, 'float_value': None, 'double_value': None}}]
我想将上述集合的值存储在多个列中,如下所示:
event_params.key
| event_params.value.string_value
| event_params.value.int_value
| event_params.value.float_value
| event_params.value.double_value
这是我的python代码
import google.oauth2.service_account as service_account
from google.cloud import bigquery
import datetime
from time import perf_counter
import sqlalchemy
import pandas as pd
today = datetime.datetime.today()
yesterday = today - datetime.timedelta(days=2)
numdays = 2
dateList = []
gcp_project = '***'
bqtable = 'analytics_###'
client = bigquery.Client(project=gcp_project,credentials=credentials)
table_ref = client.dataset(bqtable)
for x in range (0, numdays):
date = yesterday - datetime.timedelta(days = x)
date_str = date.strftime('%Y%m%d')
dateList.append(date_str)
df = pd.DataFrame()
for i in dateList:
query = f"""SELECT * FROM `***.analytics_####.events_{i}`"""
def bq2bi(sql):
query = client.query(sql)
query_results = query.result()
return query_results.to_dataframe()
df = pd.concat([df,bq2bi(query)])
main_df_2 = df.applymap(str)
print(main_df_2)
try:
main_df_2.to_sql(con=con, name='Firebase', if_exists='replace')
except:
print('database failed to update')
else:
print("database updated")
Stop = perf_counter()
print("Script ran in",round(Stop-Start,2),"seconds")
如果有更好的方法从 bigquery 中提取数据而不将其转换为集合列表,请提出建议!
您可以在查询中使用 bigquery 的 unnest() 函数来展平数据集。
您还可以使用 _table_suffix
将日期传递给 bigquery
查询类似于:
select
events.*,
params.*
from
`project_id.analytics.events_*` as events,
unnest(event_params) as params
where
_table_suffix >= format_date("%Y%m%d", date_add(current_date('Australia/Sydney'), INTERVAL -7 day))
解释:
unnest()
函数会将 event_params
拉出到单独的列中。从看起来像:
event_date | event_params
2022-01-01 | [{ key: 'update_with_analytics', ...},{key: 'firebase_conversion', ...}]
到
event_date | key | ...
2022-01-01 | update_with_analytics' | ...
2022-01-01 | firebase_conversion | ...
_table_suffix
允许您一次查询多个 table。您将有 table 个名字,例如 events_20220101
events_20220102
等(每个日期一个)。您可以在 table 名称中使用通配符来处理多个日期。因此 events_202201*
会找到 2022 年 1 月的所有日期,而 events_*
会匹配所有 table。
当您在 table 名称中使用通配符时,您可以访问虚拟列 _table_suffix
,其中包含 table 名称
的匹配部分
上面的示例然后使用一些日期函数来提取最近 7 天的数据
最后一点,您可能希望将查询编辑为仅 return 您需要的列,因为 bigquery 根据查询的数据量收费。
我用 Python 从 BigQyery 中提取了一个 SQL 查询结果,并将结果存储在数据框中,其中一个字段 event_params
已保存为集合列表如下
[{'key': 'update_with_analytics', 'value': {'string_value': None, 'int_value': 0.0, 'float_value': None, 'double_value': None}}
{'key': 'firebase_event_origin', 'value': {'string_value': 'auto', 'int_value': None, 'float_value': None, 'double_value': None}}
{'key': 'firebase_conversion', 'value': {'string_value': None, 'int_value': 1.0, 'float_value': None, 'double_value': None}}
{'key': 'previous_first_open_count', 'value': {'string_value': None, 'int_value': 0.0, 'float_value': None, 'double_value': None}}]
我想将上述集合的值存储在多个列中,如下所示:
event_params.key
| event_params.value.string_value
| event_params.value.int_value
| event_params.value.float_value
| event_params.value.double_value
这是我的python代码
import google.oauth2.service_account as service_account
from google.cloud import bigquery
import datetime
from time import perf_counter
import sqlalchemy
import pandas as pd
today = datetime.datetime.today()
yesterday = today - datetime.timedelta(days=2)
numdays = 2
dateList = []
gcp_project = '***'
bqtable = 'analytics_###'
client = bigquery.Client(project=gcp_project,credentials=credentials)
table_ref = client.dataset(bqtable)
for x in range (0, numdays):
date = yesterday - datetime.timedelta(days = x)
date_str = date.strftime('%Y%m%d')
dateList.append(date_str)
df = pd.DataFrame()
for i in dateList:
query = f"""SELECT * FROM `***.analytics_####.events_{i}`"""
def bq2bi(sql):
query = client.query(sql)
query_results = query.result()
return query_results.to_dataframe()
df = pd.concat([df,bq2bi(query)])
main_df_2 = df.applymap(str)
print(main_df_2)
try:
main_df_2.to_sql(con=con, name='Firebase', if_exists='replace')
except:
print('database failed to update')
else:
print("database updated")
Stop = perf_counter()
print("Script ran in",round(Stop-Start,2),"seconds")
如果有更好的方法从 bigquery 中提取数据而不将其转换为集合列表,请提出建议!
您可以在查询中使用 bigquery 的 unnest() 函数来展平数据集。
您还可以使用 _table_suffix
将日期传递给 bigquery查询类似于:
select
events.*,
params.*
from
`project_id.analytics.events_*` as events,
unnest(event_params) as params
where
_table_suffix >= format_date("%Y%m%d", date_add(current_date('Australia/Sydney'), INTERVAL -7 day))
解释:
unnest()
函数会将 event_params
拉出到单独的列中。从看起来像:
event_date | event_params
2022-01-01 | [{ key: 'update_with_analytics', ...},{key: 'firebase_conversion', ...}]
到
event_date | key | ...
2022-01-01 | update_with_analytics' | ...
2022-01-01 | firebase_conversion | ...
_table_suffix
允许您一次查询多个 table。您将有 table 个名字,例如 events_20220101
events_20220102
等(每个日期一个)。您可以在 table 名称中使用通配符来处理多个日期。因此 events_202201*
会找到 2022 年 1 月的所有日期,而 events_*
会匹配所有 table。
当您在 table 名称中使用通配符时,您可以访问虚拟列 _table_suffix
,其中包含 table 名称
上面的示例然后使用一些日期函数来提取最近 7 天的数据
最后一点,您可能希望将查询编辑为仅 return 您需要的列,因为 bigquery 根据查询的数据量收费。