Spark:在查询中两次使用临时表?

Posted

技术标签:

【中文标题】Spark:在查询中两次使用临时表?【英文标题】:Spark: Use Temporary Table Twice in Query? 【发布时间】:2016-04-28 20:00:41 【问题描述】:

我正在努力将一组 Hive 查询转换为在 spark 上运行。到目前为止,通过创建 TEMP 表,我已经获得了不错的性能提升,而 Hive 以前在磁盘上创建新表。我遇到了一个查询,其中 TEMP 表在同一个查询中被调用两次,这导致失败。我试图将我的临时表写入磁盘,但我注意到“saveAsTable”函数已被弃用,当我尝试使用它时,我的程序由于执行程序超时而失败。无论如何,我宁愿不必写入光盘。我考虑过重写配置单元查询,但更愿意不理会它。我还有其他选择吗?

示例查询

SELECT d.LEVEL_1,
       d.LEVEL_2,
       d.CODE
           FROM
  ( SELECT DISTINCT CP.LEVEL_1_ID,
                    LEVEL_2_ID,
   FROM ETL_ESTIMATED_PROVIDER_DATA_1_1 CP
LEFT JOIN ETL_ESTIMATED_PROVIDER_DATA_1_1 F ON D.demo_id = F.demo_id
AND D.LEVEL_1_ID = F.LEVEL_1_ID
AND D.LEVEL_2_ID = F.LEVEL_2_ID

我已经稍微减少了查询以尝试显示基本概念,但在减少过程中可能会破坏它。

【问题讨论】:

【参考方案1】:

您的查询包含多个部分。你试过跑步吗 -

第一

SELECT CP.LEVEL_1_ID,
                    LEVEL_2_ID,
   FROM ETL_ESTIMATED_PROVIDER_DATA_1_1 CP
LEFT JOIN ETL_ESTIMATED_PROVIDER_DATA_1_1 F ON D.demo_id = F.demo_id
AND D.LEVEL_1_ID = F.LEVEL_1_ID
AND D.LEVEL_2_ID = F.LEVEL_2_ID

SELECT DISTINCT CP.LEVEL_1_ID,
                    LEVEL_2_ID,
   FROM ETL_ESTIMATED_PROVIDER_DATA_1_1 CP
LEFT JOIN ETL_ESTIMATED_PROVIDER_DATA_1_1 F ON D.demo_id = F.demo_id
AND D.LEVEL_1_ID = F.LEVEL_1_ID
AND D.LEVEL_2_ID = F.LEVEL_2_ID

另外,第二个是你的答案。您无需在此基础上再进行一次选择。您在第二次选择中缺少d.CODE

我在 spark 中运行过类似的自联接,它可以工作。

【讨论】:

以上是关于Spark:在查询中两次使用临时表?的主要内容,如果未能解决你的问题,请参考以下文章

在 pyspark 查询中使用临时表

Spark JDBC 找不到临时表

退出函数时删除临时表

SQL 查询优化:在事实表中两次使用相同指标的最佳方法是啥?

如何在 Spark SQL 中缓存和持久化临时表?

无法从直线访问 Spark 2.0 临时表