我最近在EMR 5.19中使用spark 2.3.0对数据集执行了ETL,其中包括了一个新的排序列。我使用以下代码来执行此操作,并注意到输出比原始数据集(均为压缩实木复合地板)大得多。
spark.sql("select * from schema.table where column = 'value'").write.bucketBy(1,"column1").sortBy("column2","column3").option("path"m"/mypath").saveAsTable("table")
然后我使用下面的方法重新运行它,并获得了预期的数据大小(与原始数据相同)。
spark.read.load("/originaldata").filter("column='value'").write.bucketBy(1,"column1").sortBy("column2","column3").option("path"m"/mypath").saveAsTable("table")
我的写方法是相同的,但是我将数据引入的方式是不同的。但是,为什么第一个结果比第二个大4倍?我不是用两种方式做完全相同的事情吗?试图查找Spark SQL和RDD之间的差异,但看不到专门写数据的任何内容。请注意,原始数据集和2个结果均以相同的方式进行分区(共3个部分共200个部分)。
答案 0 :(得分:0)
在使用这些方法获得相同的大于预期的结果之后,我改用了此方法
spark.read.load("/originaldata").filter("column='value'").sort("column1","column2").write.save("/location")
这可以按预期工作,并且不会失败。也不会使用任何不必要的Hive saveAsTable
功能。比sortBy
和bucketBy
和saveAsTable