如何在 Spark 中输出桶式镶木地板文件?

and*_*bd1 5 apache-spark parquet apache-spark-sql

背景

我有 8k parquet 文件,代表一个表,我想按特定列对它进行存储,创建一组新的 8k parquet 文件。我想这样做,以便来自分桶列上其他数据集的连接不需要重新洗牌。我正在处理的文档在这里:

https://spark.apache.org/docs/latest/sql-data-sources-load-save-functions.html#bucketing-sorting-and-partitioning

问题

输出分桶的镶木地板文件的最简单方法是什么?我想做这样的事情:

df.write()
    .bucketBy(8000, "myBucketCol")
    .sortBy("myBucketCol")
    .format("parquet")
    .save("path/to/outputDir");
Run Code Online (Sandbox Code Playgroud)

但根据上面链接的文档:

分桶和排序仅适用于持久化表

我猜我需要使用saveAsTable而不是save. 然而saveAsTable不走路。我需要在调用之前创建一个表吗saveAsTable?我是否在该表创建语句中声明了镶木地板文件应写入的位置?如果是这样,我该怎么做?

and*_*bd1 0

spark.sql("drop table if exists myTable");
spark.sql("create table myTable ("
    + "myBucketCol string, otherCol string ) "
    + "using parquet location '" + outputPath + "' "
    + "clustered by (myBucketCol) sorted by (myBucketCol) into 8000 buckets"
);
enlDf.write()
    .bucketBy(8000, "myBucketCol")
    .sortBy("myBucketCol")
    .format("parquet")
    .mode(SaveMode.Append)
    .saveAsTable("myTable");
Run Code Online (Sandbox Code Playgroud)

  • 这看起来很奇怪。你必须使用sql字符串来进行分桶吗? (2认同)