如何使用PySpark(databricks)在本地加速下载CSV文件?

如何使用PySpark(databricks)在本地加速下载CSV文件?,pyspark,databricks,Pyspark,Databricks,我们创建了一个图像分类器来预测某些instagram图像是否属于某一类。运行此模型效果良好 #creating deep image feauturizer using the InceptionV3 lib featurizer = DeepImageFeaturizer(inputCol="image", outputCol="features", modelName="Inc

我们创建了一个图像分类器来预测某些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)
我们将其与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)”部分会影响写作表现。 希望这有帮助