【问题标题】:How to create a temporary table in snowflake based on pyspark dataframe如何基于pyspark数据框在雪花中创建临时表
【发布时间】:2022-07-13 06:05:58
【问题描述】:
我可以使用 sqlContext 读取 pyspark 数据框中的雪花表
sql = f"""select * from table1""";
df = sqlContext.read
.format(SNOWFLAKE_SOURCE_NAME)
.options(**snowflake_options)
.option("query", sql)
.load()
如何在雪花中创建一个临时表(使用 pyspark 代码)并从该 pyspark 数据帧 (df) 中插入值?
【问题讨论】:
标签:
pyspark
snowflake-cloud-data-platform
【解决方案1】:
像往常一样保存,雪花格式
snowflake_options = {
...
'sfDatabase': 'dbabc',
'dbtable': 'tablexyz',
...
}
(df
.write
.format(SNOWFLAKE_SOURCE_NAME)
.options(**snowflake_options)
.save()
)
【解决方案2】:
我不相信这是可以做到的。至少不是你想要的方式。
从技术上讲,您可以创建一个临时表;但是坚持它是我很难找到如何去做的事情(即我没有)。如果您运行以下命令:
spark.sparkContext._jvm.net.snowflake.spark.snowflake.Utils.runQuery(snowflake_options, 'create temporary table tmp_table (id int, value text)')
您会注意到它成功返回了一个 java 对象,表明临时表已成功创建;但是一旦你尝试在它上面运行任何进一步的语句,你就会得到令人讨厌的错误,这意味着它不再存在。不知何故,我们普通人需要找到一种方法来通过 jvm api 访问和持久化 Snowflake 会话。话虽如此,我也认为这与 Spark 范式背道而驰。
如果您真的需要在 Snowflake 上运行转换而不是将其全部导入 Spark 以提高特殊情况下的性能,只需将所有内容都保留在 Snowflake 中,然后开始
- 在查询中使用 CTE,或
- 使用上述
runQuery api 创建“临时”永久/临时表并设计直接插入其中的雪花查询,然后在完成后清理(删除它们)。