我有一组大约1.8 gb的未经修改的机器学习功能。为了加快对这些功能的操作,我将这些功能分成了十分之几-现在,我有了一个0.6 gb的整数功能集。问题在于此0.6 gb文件的读取速度比1.8 gb文件慢。
为验证问题,我首先尝试将随机浮点数和随机整数写入新的Parquet文件并测试这些文件的读取性能。正如预期的那样,随机整数的读取速度可能比随机浮点数更快。
我还尝试重新写入合并的数据:我将其写为CSV,然后读取并将其重新写为Parquet,然后再次测试了读取性能。在这种情况下,合并后的数据实际上比原始数据要快。
在这些测试用例之间,当我写入原始的0.6 gb合并数据时,似乎正在存储一些不需要的元数据。但是我在Spark文档中看不到任何用于修改Parquet写入操作的选项,并且mergeSchema读取选项没有帮助(DataFrameReader,DataFrameWriter)。还有其他选择吗?如果一切正常,为什么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
"""