Scala Spark是否能够在不首先将数据保存在内存中的情况下处理数据?

Scala Spark是否能够在不首先将数据保存在内存中的情况下处理数据?,scala,apache-spark,Scala,Apache Spark,我注意到,对于这样一个简单的任务,读取ORC数据,以拼花格式将它们写出来: val df = spark.read.option("basePath", "/projects/mydb/mytable").format("org.apache.spark.sql.execution.datasources.orc").load("/projects/mydb/mytable/*") val df2 = df.select("field1","field2","field3") df2.wri

我注意到,对于这样一个简单的任务,读取ORC数据,以拼花格式将它们写出来:

val df = spark.read.option("basePath", "/projects/mydb/mytable").format("org.apache.spark.sql.execution.datasources.orc").load("/projects/mydb/mytable/*")

val df2 = df.select("field1","field2","field3")

df2.write.option("mapreduce.fileoutputcommitter.algorithm.version", "2").format("parquet").save("/projects/outputfolder1/")

与hive相比,Spark需要很长的时间和更多的资源,而hive只是一个简单的插入表选择

物理计划看起来没什么特别的,比如:

Execute InsertIntoHadoopFsRelationCommand InsertIntoHadoopFsRelationCommand xxxx(source folder), false, format, Map(mapreduce.fileoutputcommitter.algorithm.version -> 2, path -> xyz_path), Overwrite, [field1, field2, field3]
+- *(1) Project [field1, field2, field3]
   +- *(1) FileScan orc ...

在观察它如何使用不同的参数驱动程序/执行器内存、内核、spark.sql.files.maxPartitionByte等工作和播放时,spark似乎会先将数据读入内存,然后再将其写出。-有没有一种方法可以告诉Spark在阅读的时候只是把它写出来?在这种情况下,不需要首先将所有数据保存在内存中

谢谢


我使用的是Spark 2.4.4和hive 1.2.1。感谢

考虑到文件到文件的复制总是使用RAM,也就是说,I/O操作几乎总是在外设和RAM之间:1文件->RAM,2 RAM->文件,这意味着Spark也必须使用RAM进行此类操作

因此,简单的答案是否定的

请参见此链接,顺便说一句:


简而言之,这是一个一般原则。

我们知道蜂巢是如何做到这一点的吗?对于同一作业,一个简单的配置单元插入表从中选择。。。对于同一集群上的相同数据,就作业的总MB秒数而言,其效率是Spark的5倍。但这并不能回答你自己的问题。太糟糕了,我们的用例是,我们想从蜂巢转移到spark。这就是为什么我们确定了这个用例,其中Spark比hive差得多-但是Hive也使用RAM和内存。启动、序列化和反序列化都有开销。