2015-11-06 52 views
6

Come da https://cwiki.apache.org/confluence/display/Hive/Common+Table+Expression vedo che le CTE sono supportate in HIVE. Tuttavia, ottengo l'errore quando si sta provando ad eseguire una semplice CTEErrore nell'usare cte su HIVE SQL - java.lang

An error occurred while calling o60.sql. 
: java.lang.StackOverflowError 
     at java.lang.ThreadLocal.set(ThreadLocal.java:201) 

ottengo questo errore quando provano la query di seguito per recuperare tutti i genitori di un nodo di destinazione

nodelist = sqlContext.sql(""" 
     SELECT node,src from known 
""") 
nodelist.registerTempTable("nodelist") 

pathcalc = sqlContext.sql(""" 
     WITH nodeMaster 
     AS (SELECT p.node, 
        p.src 
      FROM  nodelist p 
      WHERE p.node = """+dest+""" 
      UNION ALL 
      SELECT c.node, 
        c.src 
      FROM  nodeMaster cte 
        INNER JOIN nodelist c ON c.node = cte.src 
     ) 
     SELECT node 
     FROM nodeMaster m 
""") 
+1

Non vorrei usare di riferimento Hive per la Spark. Non tutte le funzionalità di Hive sono supportate in Spark. Per ulteriori informazioni consultare [Funzioni Hive supportate] (http://spark.apache.org/docs/latest/sql-programming-guide.html#supported-hive-features) in [Spark SQL e DataFrame Guide] (http://spark.apache.org/docs/latest/sql-programming-guide.html) – zero323

risposta

0

si fa riferimento a vostra tabella CTE nodeMaster all'interno della clausola WITH. Secondo https://cwiki.apache.org/confluence/display/Hive/Common+Table+Expression, questo riferimento ricorsivo non è supportato.

Invece si può decidere di fare qualcosa di simile

WITH nodedest AS 
     (SELECT p.node, 
       p.src 
      FROM nodelist p 
      WHERE p.node = {dest} 
    ) 
    SELECT nodelist.node 
    FROM nodedest 
    INNER JOIN nodelist 
     ON nodelist.node = nodedest.src