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 中指定多个存储桶来按高基数列进行重新分区吗?
我们是否可以在 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 不兼容,并且似乎具有如此意想不到的性能影响。
| 归档时间: |
|
| 查看次数: |
6451 次 |
| 最近记录: |