如何为未来的排序合并连接保留已排序的镶木桌?

时间:2015-08-26 02:54:17

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

我希望在S3上将一个大的排序的表保存到Parquet,然后将其读入并使用Sorted Merge Join策略将其连接到另一个大型排序表。

问题是:即使我事先在连接键上对这些表进行排序,一旦我将它们保存到Parquet,它们似乎就会丢失有关其排序的信息。有没有提示Spark,下次我读它们时不需要使用它们?

我一直在Spark 1.5上尝试这个,我一直看到SQL EXPLAIN计划:

[== Physical Plan ==]
[TungstenProject [pos#28400,workf...#28399]]
[ SortMergeJoin [CHROM#28403,pos#28400], [CHROM#28399,pos#28332]]
[  TungstenSort [CHROM#28403 ASC,pos#28400 ASC], false, 0]
[   TungstenExchange hashpartitioning(CHROM#28403,pos#28400)]
[    ConvertToUnsafe]
[     Scan ParquetRelation[file:/....sorted.parquet][pos#284....8424]]
[  TungstenSort [CHROM#28399 ASC,pos#28332 ASC], false, 0]
[   TungstenExchange hashpartitioning(CHROM#28399,pos#28332)]
[    ConvertToUnsafe]
[     Scan ParquetRelation[file:....exploded_sorted.parquet][pos#2.....399]]

你可以在那里看到额外的TungstenExchange和TungstenSort阶段,即使这个连接是在保存到Parquet之前在连接键上排序orderBy的两个表上。

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:2)

不幸的是,Spark-2.0不支持使用bucketing写入S3。我昨天尝试了Spark-2.0-priview

<div class="main-parent">
  <div class="left-sidebar">asda</div>
  <div class="right-content">dsdf</div>
</div>

收到此错误消息:

val NUMBER_OF_BUCKETS = 20
rdd.toDF.write.mode(SaveMode.Overwrite)
        .bucketBy(NUMBER_OF_BUCKETS,"data_frame_key")
        .partitionBy("day")
        .save("s3://XXXXX")