我们创建了一个ImageClassifier来预测某些instagram图片是否属于某个类别。运行此模型可以正常工作。
#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)
我们是从基表(在更高的集群上运行)中单独进行此操作的。我们需要将spark_model预测提取为csv,以便将其重新导入另一个笔记本中,并将其与我们的基表合并。
为此,我们尝试了以下方法
image_final_estimation = spark_model.transform(image_final)
display(image_final_estimation) #since this gives an option in databricks to
download the csv
AND
image_final_estimation.coalesce(1).write.csv(path = 'imagesPred2.csv') #and then we would be able to read it back in with spark.read.csv
问题是这些操作花费的时间很长(可能由于任务的性质),它们使我们的集群崩溃。我们能够显示结果,但不仅可以使用“ .show()”显示,还可以使用display()方法显示。
还有其他方法可以在本地保存此csv吗?或者我们如何提高这些任务的速度?
请注意,我们使用的是Databricks社区版。
答案 0 :(得分:0)
在文件上存储DataFrame时,一种并行进行写入的好方法是定义与该DataFrame / RDD相关的适当数量的分区。 在您显示的代码中,您正在使用合并功能(该功能基本上将分区数减少为1,从而减少了并行性的影响)。
在Databricks社区版上,我使用Databricks(https://docs.databricks.com/getting-started/databricks-datasets.html)提供的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)
因此,对于相同的DataFrame,向一个分区的csv写入需要4,13秒。
总而言之,在这种情况下,“ coalesce(1)”部分会影响书写性能。 希望这会有所帮助