从Spark SQL与RDD api编写数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从Spark SQL与RDD api编写数据相关的知识,希望对你有一定的参考价值。

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

答案

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

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

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

以上是关于从Spark SQL与RDD api编写数据的主要内容,如果未能解决你的问题,请参考以下文章

Spark RDD API详解(转)

Spark SQL的介绍和DataFrame的建立及使用

Spark RDD API(scala)

Spark笔记:RDD基本操作(上)

Spark SQL概述

如何成为云计算大数据Spark高手