Spark Dataframes 中的分区和集群方式

Sub*_*ian 2 apache-spark apache-spark-sql

我们是否可以在 Spark 中按列进行分区,然后按另一列进行聚类?

在我的示例中,我在具有数百万行的表中有一month列和一cust_id列。我可以说当我将 DataFrame 保存到 hive 表以根据月份和集群将表分区cust_id为 50 个文件时吗?

忽略聚类 by cust_id,这里有三个不同的选项

df.write.partitionBy("month").saveAsTable("tbl")
df.repartition(100).write.partitionBy("month").saveAsTable("tbl")
df.repartition("month").write.saveAsTable("tbl")
Run Code Online (Sandbox Code Playgroud)

第一种情况和最后一种情况与 Spark 所做的相似,但我认为它只是在 Hive 中以不同的方式写入数据(文件夹而不是每个月的文件)。

在第二个选项中,重新分区是由partitionBy不是吗?

我怎样才能至少避免这种情况?

甚至可以通过在 Spark 中指定多个存储桶来按高基数列进行重新分区吗?

hi-*_*zir 6

我们是否可以在 Spark 中按列进行分区,然后按另一列进行聚类?

有可能,但repartition不会在这里帮助你。

df.write
  .partitionBy("month")
  .clusterBy(50, "id")
  .saveAsTable("tbl")
Run Code Online (Sandbox Code Playgroud)

这是等效的:

CREATE TABLE users_bucketed_and_partitioned(
 month T,
 id U
) USING parquet 
PARTITIONED BY (month)
CLUSTERED BY(id) INTO 50 BUCKETS;
Run Code Online (Sandbox Code Playgroud)

请记住它与 Hive 不兼容,并且似乎具有如此意想不到的性能影响。

  • 哪个版本的 Spark 可以使用此功能?我正在使用 Spark 2.1,但在 pyspark 上找不到它。这只能在scala上吗?错误:“DataFrameWriter”对象没有属性“clusterBy” (2认同)