使用不同格式(csv、json、avro)将数据加载到 pd.DataFrame 的最快方法

Posted

技术标签:

【中文标题】使用不同格式(csv、json、avro)将数据加载到 pd.DataFrame 的最快方法【英文标题】:fastest way to load data to a pd.DataFrame using different formats (csv, json, avro) 【发布时间】:2018-07-25 16:24:50 【问题描述】:

我们正在从google bigquery 加载大量数据到pandas dataframe(直接作为pandas 使用,也作为xgbMatrix 使用)。

BQ 导出格式为CSVJSONAVRO,我们的数据有日期、整数、浮点数和字符串,并且通常是“宽”(多列)。我们的第一种方法是将数据导入为 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 创建的所有文件都可以使用任何当前可用的库读取。 【参考方案1】:

使用 pandas pandas.read_gbq 它是专门为 google bigquery 设计的。

您可能希望以块的形式导出它,然后构建一个dask 管道来解析它并并行加载它(并且以比内存更大的方式)。

据此answer

BigQuery 能够以块的形式导出数据 - 您可以请求与工作人员一样多的块。

如果数据没有嵌套和重复(注意Export limitations),您可以导出到csv 并使用dasks read_csv 方法让您的生活更轻松。

【讨论】:

【参考方案2】:

在处理如此大的文件时,我会使用 Parquet 格式的 Spark。通过这种方式,您可以扩展读取和计算。 Pandas 不适合这么大的文件。

【讨论】:

以上是关于使用不同格式(csv、json、avro)将数据加载到 pd.DataFrame 的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Apache nifi 中配置 convertrecord 处理器,以便将 JSON 转换为 AVRO 格式

将数据保存到HDFS的格式是什么?

如何读取 CSV 并生成 json/avro 文件,其中 pig 按第一列的值分组?

使用 AVRO 格式的 BigQuery 流式插入

前端导出csv表格实现方法

使用 Java 将 Json 对象转换为 Parquet 格式而不转换为 AVRO(不使用 Spark、Hive、Pig、Impala)