df.SaveAsTable和spark.sql(创建表..)之间的区别

时间:2019-04-15 15:53:43

标签: scala apache-spark hive pyspark apache-spark-sql

请参见here,了解saveastable和insertInto之间的区别

以下两种方法有什么区别:

df.saveAsTable("mytable");

df.createOrReplaceTempView("my_temp_table");
spark.sql("drop table if exists " + my_temp_table);
spark.sql("create table mytable as select * from 
my_temp_table");

在哪种情况下表存储在内存中,在哪种情况下物理存储在磁盘上?

另外,据我了解,createOrReplaceTempView仅注册要通过Hive查询访问的数据帧(已在内存中),而无需实际保留,是否正确?

我必须加入数百个表并遇到OutOfMemory问题。 就效率而言,最好的方法是什么?

  • df.persist()和df.join(..)。join(..)。join(..)....#数百个联接

  • createOrReplaceTempView,然后与spark.sql()

  • 加入
  • SaveAsTable(?不确定下一步)

  • 使用Create Table写入磁盘,然后使用spark.sql()加入磁盘吗?

1 个答案:

答案 0 :(得分:2)

让我们逐步进行。

df.saveAsTable("mytable")的情况下,该表实际上已写入存储(HDFS / S3)。这是一个Spark动作。

另一方面: df.createOrReplaceTempView("my_temp_table")是一个转换。它只是用于df的DAG的标识符。实际上什么也没有存储在内存或磁盘中。

spark.sql("drop table if exists " + my_temp_table)删除表格。

spark.sql("create table mytable as select * from my_temp_table")在存储上创建mytablecreateOrReplaceTempViewglobal_temp数据库中创建表。

最好将查询修改为:

create table mytable as select * from global_temp.my_temp_table

  

createOrReplaceTempView仅注册数据框(已在   内存)可通过Hive查询访问,而无需实际   坚持下去,对吗?

是的,对于大型DAG,spark将根据spark.memory.fraction设置自动缓存数据。检查this页。

  

我必须加入数百个表并遇到OutOfMemory问题。在条款上   效率,最好的方法是什么?

df.persist() and df.join(..).join(..).join(..).... #hundred joins

createOrReplaceTempView then join with spark.sql(),

SaveAsTable (? not sure the next step)

Write to disk with Create Table then join with spark.sql()?

persist将根据可用内存以缓存格式存储一些数据,对于通过连接数百个表而生成的终端表,这可能不是最佳方法。

不可能提出适合您的方法,但以下是一些常规模式:

如果写入失败并使用OOM且使用默认的spark.shuffle.partitions,则首先要增加随机播放分区数,以确保每个执行者的分区的大小取决于其内存可用性。

spark.shuffle.partitions设置可以在不同的联接中进行设置,在Spark作业中不必为常数。

如果涉及多个表,则计算分区大小变得困难。在这种情况下,写磁盘并在大表之前读回是个好主意。

对于小于2GB的小桌子,可以进行广播。默认限制为10MB(我认为),但是可以更改。

最好将最终表存储在磁盘上,而不是通过临时表为节俭的客户端提供服务。

祝你好运!