将 DataFrame 写入 Parquet 或 Delta 似乎没有被并行化 - 耗时太长

bor*_*ula 3 scala apache-spark azure-data-lake databricks azure-databricks

问题陈述

我已将分区的 CSV 文件读入 Spark 数据帧。

为了利用 Delta Tables 的改进,我试图简单地将它作为 Delta 导出到 Azure Data Lake Storage Gen2 内的目录中。我在 Databricks 笔记本中使用以下代码:

%scala

df_nyc_taxi.write.partitionBy("year", "month").format("delta").save("/mnt/delta/")
Run Code Online (Sandbox Code Playgroud)

整个数据帧大约有 160 GB。

硬件规格

我正在使用具有 12 个内核和 42 GB RAM 的集群运行此代码。

但是看起来整个写入过程是由 Spark/Databricks 顺序处理的,例如非并行方式

在此处输入图片说明

DAG 可视化如下所示:

在此处输入图片说明

总而言之,这将需要 1-2 个小时才能执行。

问题

  • 有没有办法让 Spark 并行写入不同的分区?
  • 问题可能是我试图将增量表直接写入 Azure Data Lake Storage?

Lon*_* Vu 5

要跟进@eliasah 评论,也许您可​​以尝试以下操作:

import org.apache.spark.sql.functions
df_nyc_taxi.repartition(col("year"), col("month"), lit(rand() * 200)).write.partitionBy("year", "month").format("delta").save("/mnt/delta/")
Run Code Online (Sandbox Code Playgroud)

@eliasah 的答案很可能只会为每个目录“/mnt/delta/year=XX/month=XX”创建一个文件,并且只有一名工作人员会将数据写入每个文件。额外的列将进一步对数据进行切片(在这种情况下,我将每个原始文件中的数据划分为 200 个较小的分区,您可以根据需要对其进行编辑),以便更多的工作人员可以同时写入。

PS:对不起,我还没有足够的代表发表评论:'D