从Spark SQL与RDD api编写数据

问题描述 投票:0回答:1

我最近在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个部分)。

apache-spark
1个回答
0
投票

在用这些方法得到相同的大于预期的结果之后,我转而改用它

spark.read.load("/originaldata").filter("column='value'").sort("column1","column2").write.save("/location")

这按预期工作,不会失败。也没有使用任何不必要的Hive saveAsTable功能。比sortBy更好的选择,这也需要bucketBysaveAsTable

© www.soinside.com 2019 - 2024. All rights reserved.