我目前正在基于Google的VM (WindowsServer2019-4vCPU)上构建一个ETL,以执行以下过程:
为了说明,下面是实际代码的一些部分(Python,迭代器在一个表上):
while True:
# GENERATES AN MYSQL QUERY BASED ON THE COLUMNS AND THEIR
# RESPECTIVE TYPES, USING A DICTIONARY TO CONVERT
# MYSQL D_TYPES TO PYTHON D_TYPES
sql_query = gen_query(cols_dict=col_types, table=table,
pr_key=p_key, offset=offset)
cursor = cnx.cursor(buffered=True)
cursor.execute(sql_query)
if cursor.rowcount == 0:
break
num_fields = len(cursor.description)
field_names = [i[0] for i in cursor.description]
records = cursor.fetchall()
df = pd.DataFrame(records, columns=columns)
offset += len(df.index)
print('Ok, df structured')
# CHECK FOR DATETIME COLUMNS
col_parse_date = []
for column in columns:
if col_types[column] == 'datetime64':
try:
df[column] = df[column].astype(col_types[column])
col_parse_date.append(column)
except:
df[column] = df[column].astype(str)
for i in to_bgq:
if i['name'] == column:
i['type'] = 'STRING'
# UPLOAD DATAFRAME TO GOOGLE BIGQUERY
df.to_csv('carga_etl.csv', float_format='%.2f',
index=False, sep='|')
print('Ok, csv recorded')
df = ''
df = pd.read_csv('carga_etl.csv', sep='|')
print('Ok, csv read')
df.to_gbq(destination_table='tr.{}'.format(table),
project_id='iugu-bi', if_exists='append', table_schema=to_bgq)逻辑基于一个查询生成器;它获取MySQL表架构,并将其调整为BigQuery格式(例如,Blob to STRING,int(n) to INTEGER等),查询全部结果(每页用偏移量分页,500 K行),并将其保存在数据中,然后上传到我的新数据库中。
嗯,ETL完成了它的工作,我目前正在将我的表迁移到云中。然而,由于网络流量不足,我担心我正在使用我的资源。下面是我的VM报告部分中的网络报告(字节/秒):
根据该报告,我的输入/输出网络数据峰值为2/3 MBs,这与我使用机器从浏览器下载东西时平均可用的1GB相比非常低。
我的意思是,我在这里做错了什么?有什么方法可以提高我的MySQL查询/获取速度和BigQuery的上传速度吗?
发布于 2020-07-16 15:36:04
我知道您正在将datetime64转换为兼容的BigQuery数据类型,如果我错了,请纠正我。
我有几项建议:
https://stackoverflow.com/questions/62218975
复制相似问题