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

时间:2016-04-28 20:00:41

标签: apache-spark hive apache-spark-sql hiveql

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

示例查询

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 个答案:

答案 0 :(得分:0)

您的查询有多个部分。你试过跑 -

第一

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中运行了类似的自连接,但它确实有效。