You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spark中如何通过临时视图名称获取对应的DataFrame?

获取Spark临时视图对应的DataFrame

嘿,我来帮你理清这个问题!首先得明确一个关键点:Spark的临时视图和你最初的DataFrame并不是同一个内存对象,所以你想用id()来验证它们是同一对象的思路从根本上就行不通——当你调用createOrReplaceTempView()时,Spark并没有保存原DataFrame的引用,而是把它的逻辑执行计划存储了起来,供后续SQL查询使用。

正确获取临时视图对应DataFrame的方法

你需要通过spark.sql()查询这个临时视图来生成对应的DataFrame,代码如下:

# 先注册你的DataFrame为临时视图
df.createOrReplaceTempView("my_name")

# 通过SQL查询获取对应的DataFrame
a_df = spark.sql("SELECT * FROM my_name")

如果是全局临时视图(用createOrReplaceGlobalTempView()注册的),则需要加上global_temp前缀:

a_df = spark.sql("SELECT * FROM global_temp.my_name")

为什么不能用id()验证?

Spark的DataFrame是不可变的分布式数据集抽象,两个DataFrame只要逻辑执行计划一致,执行后得到的结果就是完全相同的,但它们在内存中是不同的对象实例,所以id(a_df)id(df)肯定不一样。如果要验证两者是否“等价”,可以通过以下方式:

  1. 对比逻辑执行计划:
# 用执行计划字符串断言两者逻辑一致
assert df.queryExecution.toString() == a_df.queryExecution.toString()
  1. 对比数据内容:
assert df.collect() == a_df.collect()

另外补充一下:spark.catalog并没有getTempView()这个方法,你之前尝试的写法本身就不符合Spark API的规范,这也是它无法工作的原因之一。

内容的提问来源于stack exchange,提问作者Philippe Prados

火山引擎 最新活动