我使用Pyspark从S3读取文件,从protobuf格式反编译,并将其写入Redshift表。一切都运行得很快,但写入Redshift所需的时间非常慢。 DataFrame大约有五十万行和100列。我遵循了提示here,here和here,但仍然运行速度极慢。这是我的代码:
rdd = sc.sequenceFile("s3a://bucket_name/file_path").values()
def f(x):
feed = proto_pb2.message()
feed.ParseFromString(bytes(x))
row_dict = {descriptor.name: getattr(feed, descriptor.name) for descriptor in feed.DESCRIPTOR.fields}
return row_dict
df = rdd.map(lambda x: Row(**f(x))).toDF()
df = df.coalesce(1)
df.write.format('jdbc').options(url='jdbc:redshift://redshift_url:5439/dev?rewriteBatchedStatements=true',
dbtable=table_stage,
user=user,
password=passwd,
batchsize=20000).mode('append').save()
我测试过从我的python解释器只上传了5行数据,需要整整8秒!
>>> import time
>>> start = time.time()
>>> df_1.write.format('jdbc').options(url='jdbc:redshift://redshift_url:5439/dev?rewriteBatchedStatements=true',
dbtable=table_stage,
user=user,
password=passwd,
batchsize=20000).mode('append').save()
>>> end = time.time()
>>> print(end - start)
8.918693780899048
必须设置一些我错过的错误信息。求救!