如何使用PySpark(databricks)在本地加速下载CSV文件?
我们创建了一个图像分类器来预测某些instagram图像是否属于某一类。运行此模型效果良好如何使用PySpark(databricks)在本地加速下载CSV文件?,pyspark,databricks,Pyspark,Databricks,我们创建了一个图像分类器来预测某些instagram图像是否属于某一类。运行此模型效果良好 #creating deep image feauturizer using the InceptionV3 lib featurizer = DeepImageFeaturizer(inputCol="image", outputCol="features", modelName="Inc
#creating deep image feauturizer using the InceptionV3 lib
featurizer = DeepImageFeaturizer(inputCol="image",
outputCol="features",
modelName="InceptionV3")
#using lr for speed and reliability
lr = LogisticRegression(maxIter=5, regParam=0.03,
elasticNetParam=0.5, labelCol="label")
#define Pipeline
sparkdn = Pipeline(stages=[featurizer, lr])
spark_model = sparkdn.fit(df)
我们将其与basetable(在更高的集群上运行)分开制作。我们需要将spark_模型预测提取为csv,将其导入到另一个笔记本中,并将其与我们的基表合并
为此,我们尝试了以下方法
image_final_estimation = spark_model.transform(image_final)
display(image_final_estimation) #since this gives an option in databricks to
download the csv
及
问题是这些操作需要很长时间(可能是由于任务的性质),它们会使我们的集群崩溃。我们能够显示我们的结果,但不仅仅是使用“.show()”,而不是使用display()方法
是否有其他方法在本地保存此csv?或者我们如何提高这些任务的速度
请注意,我们使用DataRicks的社区版。在文件上存储数据帧时,并行写入的一个好方法是定义与该数据帧/RDD相关的适当数量的分区。 在您显示的代码中,您使用的是coalesce函数(它基本上将分区数减少为1,从而减少了并行性的影响) 在Databricks Community Edition上,我使用Databricks()提供的CSV数据集尝试了以下测试。其思想是通过使用一个分区与使用多个分区将数据写入csv来测量所用的时间
carDF = spark.read.option("header", True).csv("dbfs:/databricks-datasets/Rdatasets/data-001/csv/car/*")
print("Total count of Rows {0}".format(carDF.count()))
print("Original Partitions Number: {0}".format(carDF.rdd.getNumPartitions()))
>>Total count of Rows 39005
>>Original Partitions Number: 7
%timeit carDF.write.format("csv").mode("overwrite").save("/tmp/caroriginal")
>>2.79 s ± 180 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
因此,到目前为止,使用7个分区在本地文件上写入数据集需要2.79秒
newCarDF = carDF.coalesce(1)
print("Total count of Rows {0}".format(newCarDF.count()))
print("New Partitions Number: {0}".format(newCarDF.rdd.getNumPartitions()))
>>Total count of Rows 39005
>>New Partitions Number: 1
%timeit newCarDF.write.format("csv").mode("overwrite").save("/tmp/carmodified")
>>4.13 s ± 172 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
因此,对于同一数据帧,使用一个分区写入csv需要4,13秒
综上所述,在这种情况下,“联合(1)”部分会影响写作表现。
希望这有助于在文件上存储数据帧时,并行写入的一个好方法是定义与该数据帧/RDD相关的适当数量的分区。 在您显示的代码中,您使用的是coalesce函数(它基本上将分区数减少为1,从而减少了并行性的影响) 在Databricks Community Edition上,我使用Databricks()提供的CSV数据集尝试了以下测试。其思想是通过使用一个分区与使用多个分区将数据写入csv来测量所用的时间
carDF = spark.read.option("header", True).csv("dbfs:/databricks-datasets/Rdatasets/data-001/csv/car/*")
print("Total count of Rows {0}".format(carDF.count()))
print("Original Partitions Number: {0}".format(carDF.rdd.getNumPartitions()))
>>Total count of Rows 39005
>>Original Partitions Number: 7
%timeit carDF.write.format("csv").mode("overwrite").save("/tmp/caroriginal")
>>2.79 s ± 180 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
因此,到目前为止,使用7个分区在本地文件上写入数据集需要2.79秒
newCarDF = carDF.coalesce(1)
print("Total count of Rows {0}".format(newCarDF.count()))
print("New Partitions Number: {0}".format(newCarDF.rdd.getNumPartitions()))
>>Total count of Rows 39005
>>New Partitions Number: 1
%timeit newCarDF.write.format("csv").mode("overwrite").save("/tmp/carmodified")
>>4.13 s ± 172 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
因此,对于同一数据帧,使用一个分区写入csv需要4,13秒
综上所述,在这种情况下,“联合(1)”部分会影响写作表现。
希望这有帮助