如何在Spark中输出桶装实木复合地板文件?

时间:2019-06-14 15:58:05

标签: apache-spark apache-spark-sql parquet

背景

我有8k个实木复合地板文件,它们代表要按特定列存储的表,从而创建了一组新的8k实木复合地板文件。我想这样做,以便从存储桶列上的其他数据集联接将不需要重新改组。我正在处理的文档在这里:

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");

但是根据上面链接的文档:

  

加括号和排序仅适用于持久表

我猜我需要使用saveAsTable而不是save。但是saveAsTable并没有采取任何措施。我需要在调用saveAsTable之前创建表吗?是在该表创建语句中声明了实木复合地板文件应写入的位置吗?如果是这样,我该怎么办?

1 个答案:

答案 0 :(得分: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");