【发布时间】:2018-07-25 16:24:50
【问题描述】:
我们正在从google bigquery 加载大量数据到pandas dataframe(直接作为pandas 使用,也作为xgbMatrix 使用)。
BQ 导出格式为CSV、JSON 和AVRO,我们的数据有日期、整数、浮点数和字符串,并且通常是“宽”(多列)。我们的第一种方法是将数据导入为 CSV,但解析时间很长:
(32 GB,126 files,CSV) -> 25 min
解析代码:
def load_table_files_to_pandas(all_files,
table_ref):
# load files to pandas
dict_dtype = {}
date_cols = []
client = bigquery.Client() # create a bq client
table = client.get_table(table_ref)
for field in table.schema:
pd_dtypes = {'string':'object',
'date':'object',
'float':'float64',
'integer':'float64'
}
dict_dtype[field.name] = pd_dtypes[field.field_type.lower()]
if field.field_type.lower()== 'date':
date_cols.append(field.name)
print('start reading data')
df_from_each_file = []
for f in all_files:
# looping over files
df_from_each_file.append(pd.read_csv(f,
dtype = dict_dtype,
parse_dates = date_cols))
print('memory in use = {}'.format(psutil.virtual_memory().percent))
df = pd.concat(df_from_each_file, ignore_index=True)
print('end reading data')
return df
pandas 中哪种格式的解析速度更快? [Avro,CSV,JSON]?是否可能没有考虑第三个?
附加
我们也尝试直接从存储和本地磁盘使用dask|csv,但解析时间几乎相同。
【问题讨论】:
-
您介意写几行代码来说明您是如何解析代码的吗?关于文件格式,我对
.parquet很满意。您可以使用最新的 pandas 版本或 dask 阅读 parquet。您可能会记住来自 Wes McKinney 的 tweet -
@user32185 添加 ;)
-
@user32185 实际上,Python 中大小 > 2GB 的 parquet 文件目前存在很多问题 - 无论您使用的是 pyarrow 还是 fastparquet 库。您将遇到限制:并非您使用 spark 创建的所有文件都可以使用任何当前可用的库读取。
标签: python pandas google-bigquery avro