【问题标题】: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 中,然后开始

      1. 在查询中使用 CTE,或
      2. 使用上述runQuery api 创建“临时”永久/临时表并设计直接插入其中的雪花查询,然后在完成后清理(删除它们)。

      【讨论】: