读取Parquet文件的速度比预期的慢

时间:2019-08-20 00:37:05

标签: python apache-spark pyspark pyspark-sql parquet

我有一组大约1.8 gb的未经修改的机器学习功能。为了加快对这些功能的操作,我将这些功能分成了十分之几-现在,我有了一个0.6 gb的整数功能集。问题在于此0.6 gb文件的读取速度比1.8 gb文件慢。

为验证问题,我首先尝试将随机浮点数和随机整数写入新的Parquet文件并测试这些文件的读取性能。正如预期的那样,随机整数的读取速度可能比随机浮点数更快。

我还尝试重新写入合并的数据:我将其写为CSV,然后读取并将其重新写为Parquet,然后再次测试了读取性能。在这种情况下,合并后的数据实际上比原始数据要快。

在这些测试用例之间,当我写入原始的0.6 gb合并数据时,似乎正在存储一些不需要的元数据。但是我在Spark文档中看不到任何用于修改Parquet写入操作的选项,并且mergeSchema读取选项没有帮助(DataFrameReaderDataFrameWriter)。还有其他选择吗?如果一切正常,为什么Parquet-> CSV-> Parquet测试可以提高性能?

# Read binned parquet files, re-write as csv, read/re-write as parquet
bins_df = spark.read.format('parquet').load('s3://sample-data/parquet-bins-10/')
bins_df.write.csv('s3://sample-data/binned-csv/')
bins_df = spark.read.csv(path = 's3://sample-data/binned-csv/', schema = dataSchema)
bins_df.write.format('parquet').mode('overwrite').option('compression', 'gzip').save('s3://sample-data/parquet-bins-10-csv/')

# Read benchmark parquet files, re-write as csv, read/re-write as parquet
benchmark_df = spark.read.format('parquet').load('s3://sample-data/parquet/')
benchmark_df.write.csv('s3://sample-data/benchmark-csv/')
benchmark_df = spark.read.csv(path = 's3://sample-data/benchmark-csv/', schema = dataSchema)
benchmark_df.write.format('parquet').mode('overwrite').option('compression', 'gzip').save('s3://sample-data/parquet-csv/')

# Test read + cache performance
res = {}
for i in ['parquet','parquet-csv','parquet-bins-10','parquet-bins-10-csv']:
    print('processing {}'.format(i))
    res[i] = timeit.Timer("df = spark.read.format('parquet').load('s3://sample-data/{}/').cache(); df.count(); df.unpersist()".format(i), setup = 'from __main__ import spark').repeat(repeat=3,number=1)

"""
'parquet':             [213.43, 213.53, 202.35]   # This is original data
'parquet-csv':         [229.91, 236.99, 213.82]   # This is original data re-written as CSV first
'parquet-bins-10':     [258.96, 249.54, 247.36]   # This is binned data
'parquet-bins-10-csv': [186.74, 147.70, 135.91]   # This is binned data re-written as CSV first
"""

0 个答案:

没有答案
相关问题