df.saveastable和spark.sql之间的差异(create table..)

xkrw2x1b  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(508)

这里是指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 只注册Dataframe(已经在内存中)以便通过配置单元查询访问,而不实际持久化它,对吗?
我不得不加入成百上千的表格,并点击outofmemory问题。就效率而言,最好的方法是什么? df.persist() 和df.join(..).join(..).join(..)#100个连接 createOrReplaceTempView 然后加入 spark.sql() , SaveAsTable (? 不确定下一步)
写入磁盘 Create Table 然后加入 spark.sql() ?

wooyq4lh

wooyq4lh1#

我们一步一步走吧。
如果是 df.saveAsTable("mytable") ,表实际上被写入存储(hdfs/s3)。这是一个Spark行动。
另一方面: df.createOrReplaceTempView("my_temp_table") 是一种转变。它只是用于的dag的标识符 df . 实际上没有任何东西存储在内存或磁盘上。 spark.sql("drop table if exists " + my_temp_table) 放下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只注册Dataframe(已经在内存中)以便通过配置单元查询访问,而不实际持久化它,对吗?
是的,对于大型DAG,spark将根据需要自动缓存数据 spark.memory.fraction 设置。检查此页。
我不得不加入成百上千的表格,并点击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(我想),但可以更改。
最好将最终的表存储在磁盘上,而不是通过临时表为旧版客户机提供服务。
祝你好运!

相关问题