请参见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()
加入磁盘吗?
答案 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")
在存储上创建mytable
。 createOrReplaceTempView
在global_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(我认为),但是可以更改。
最好将最终表存储在磁盘上,而不是通过临时表为节俭的客户端提供服务。
祝你好运!