2017-03-02 93 views
0

你能帮我克服当我尝试创建下表时遇到的错误吗?Hive创建表错误。

感谢

CREATE TABLE RANGE_FT (HOSP_VAR STRING, RANGE INT) 
AS 
      SELECT 'EMR' ,MAX(emr_avg_score) - MIN(emr_avg_score) from JOIN9 
    UNION SELECT 'SCI' ,MAX(sci_avg_score) - MIN(sci_avg_score) from JOIN9 
    UNION SELECT 'ASTH' ,MAX(asth_avg_score) - MIN(asth_avg_score) from JOIN9 
    UNION SELECT 'HF' ,MAX(hf_avg_score) - MIN(hf_avg_score) from JOIN9 
    UNION SELECT 'SC' ,MAX(sc_avg_score) - MIN(sc_avg_score) from JOIN9 
    UNION SELECT 'PNEU' ,MAX(pneu_avg_score) - MIN(pneu_avg_score) from JOIN9 
    UNION SELECT 'PREV' ,MAX(prev_avg_score) - MIN(prev_avg_score) from JOIN9 
    UNION SELECT 'BC' ,MAX(BC_avg_score) - MIN(BC_avg_score) from JOIN9 
    UNION SELECT 'HEART' ,MAX(heart_avg_score) - MIN(heart_avg_score) from JOIN9 
    UNION SELECT 'PREG' ,MAX(preg_avg_score) - MIN(preg_avg_score) from JOIN9 
; 

线7:6 ALL在 'SELECT'

+0

试试SET NOCOUNT查询 –

+0

之前,请用文本替换图像(粘贴后,选中它,然后按CTRL + K对其进行格式化代码) –

+0

嗨辛格,谢谢你你的帮助。你可以更加关于如何设置nocount吗?我的意思是我应该把这个命令放在哪里。我的代码是:DROP TABLE RANGE_FT; CREATE TABLE RANGE_FT (HOSP_VAR STRING, RANGE INT) AS SELECT 'EMR',MAX(emr_avg_score) - 从JOIN9 MIN(sci_avg_score) - MIN(emr_avg_score)从JOIN9 UNION SELECT 'SCI',MAX(sci_avg_score) 来自JOIN9的UNION SELECT'ASTH',MAX(asth_avg_score)-min(asth_avg_score)来自JOIN9的UNION SELECT'HF',MAX(hf_avg_score)-min(hf_avg_score) –

回答

1
  1. UNION丢失不被你的蜂巢版本支持(而这也不是你所需要的这里)。
    改为使用UNION ALLhttps://cwiki.apache.org/confluence/display/Hive/LanguageManual+Union

  2. UNION [ALL]需要双方都有相同的模式。
    在Hive中,与其他SQL方言不同,不仅类型应该相似,而且列别名也应该相似。 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Union

  3. 您不能在创建语句中列出列。
    将相关别名添加到SELECT子句。


这是您的查询

CREATE TABLE RANGE_FT 
AS 
       SELECT 'EMR' as HOSP_VAR ,MAX (emr_avg_score) - MIN (emr_avg_score) as RANGE from JOIN9 
    UNION ALL SELECT 'SCI' as HOSP_VAR ,MAX (sci_avg_score) - MIN (sci_avg_score) as RANGE from JOIN9 
    UNION ALL SELECT 'ASTH' as HOSP_VAR ,MAX (asth_avg_score) - MIN (asth_avg_score) as RANGE from JOIN9 
    UNION ALL SELECT 'HF' as HOSP_VAR ,MAX (hf_avg_score) - MIN (hf_avg_score) as RANGE from JOIN9 
    UNION ALL SELECT 'SC' as HOSP_VAR ,MAX (sc_avg_score) - MIN (sc_avg_score) as RANGE from JOIN9 
    UNION ALL SELECT 'PNEU' as HOSP_VAR ,MAX (pneu_avg_score) - MIN (pneu_avg_score) as RANGE from JOIN9 
    UNION ALL SELECT 'PREV' as HOSP_VAR ,MAX (prev_avg_score) - MIN (prev_avg_score) as RANGE from JOIN9 
    UNION ALL SELECT 'BC' as HOSP_VAR ,MAX (BC_avg_score) - MIN (BC_avg_score) as RANGE from JOIN9 
    UNION ALL SELECT 'HEART' as HOSP_VAR ,MAX (heart_avg_score) - MIN (heart_avg_score) as RANGE from JOIN9 
    UNION ALL SELECT 'PREG' as HOSP_VAR ,MAX (preg_avg_score) - MIN (preg_avg_score) as RANGE from JOIN9 
; 

的固定版本,而这里是只有一个SELECT

create table RANGE_FT 
as 
select inline 
     (
      array 
      (
       struct ('EMR' ,MAX (emr_avg_score) - MIN (emr_avg_score) ) 
       ,struct ('SCI' ,MAX (sci_avg_score) - MIN (sci_avg_score) ) 
       ,struct ('ASTH' ,MAX (asth_avg_score) - MIN (asth_avg_score)) 
       ,struct ('HF' ,MAX (hf_avg_score) - MIN (hf_avg_score) ) 
       ,struct ('SC' ,MAX (sc_avg_score) - MIN (sc_avg_score) ) 
       ,struct ('PNEU' ,MAX (pneu_avg_score) - MIN (pneu_avg_score)) 
       ,struct ('PREV' ,MAX (prev_avg_score) - MIN (prev_avg_score)) 
       ,struct ('BC' ,MAX (BC_avg_score) - MIN (BC_avg_score) ) 
       ,struct ('HEART' ,MAX (heart_avg_score) - MIN (heart_avg_score)) 
       ,struct ('PREG' ,MAX (preg_avg_score) - MIN (preg_avg_score)) 
      ) 
     ) as (HOSP_VAR,RANGE) 

from JOIN9  
; 
+0

我得到了一个错误失败:SemanticException [错误10065]:CREATE TABLE AS SELECT命令无法指定目标表的列列表 –

+0

我只是将它发布到文本中。非常感谢您的帮助Dudu –

+0

Hi Dudu,你能告诉我你如何创建这张桌子的魔术?非常感谢你的回复。 –

0

这将工作的替代解决方案正如Dudu所提到的,你不能给列名称w hile用select创建。您可以使用Union,但性能明智的UNION ALL更好。根据您的用例

CREATE TABLE RANGE_FT 
AS 
      SELECT 'EMR' AS HOSP_VAR ,MAX(emr_avg_score) - MIN(emr_avg_score) AS `RANGE` from JOIN9 
    UNION SELECT 'SCI' AS HOSP_VAR ,MAX(sci_avg_score) - MIN(sci_avg_score) AS `RANGE` from JOIN9 
    UNION SELECT 'ASTH' AS HOSP_VAR ,MAX(asth_avg_score) - MIN(asth_avg_score) AS `RANGE` from JOIN9 
    UNION SELECT 'HF' AS HOSP_VAR ,MAX(hf_avg_score) - MIN(hf_avg_score) AS `RANGE` from JOIN9 
    UNION SELECT 'SC' AS HOSP_VAR ,MAX(sc_avg_score) - MIN(sc_avg_score) AS `RANGE` from JOIN9 
    UNION SELECT 'PNEU' AS HOSP_VAR ,MAX(pneu_avg_score) - MIN(pneu_avg_score) AS `RANGE` from JOIN9 
    UNION SELECT 'PREV' AS HOSP_VAR ,MAX(prev_avg_score) - MIN(prev_avg_score) AS `RANGE` from JOIN9 
    UNION SELECT 'BC' AS HOSP_VAR ,MAX(BC_avg_score) - MIN(BC_avg_score) AS `RANGE` from JOIN9 
    UNION SELECT 'HEART' AS HOSP_VAR ,MAX(heart_avg_score) - MIN(heart_avg_score) AS `RANGE` from JOIN9 
    UNION SELECT 'PREG' AS HOSP_VAR ,MAX(preg_avg_score) - MIN(preg_avg_score) AS `RANGE` from JOIN9 
; 
+0

嗨阿希什,谢谢你的帮助。但即使我删除列名称并运行代码,错误仍然显示像这样失败:ParseException行4:12在'SELECT'在''附近缺少ALL' 行5:12在'SELECT'附近'' –

+0

@QingZhang请别名列名并将Range列放入反斜杠中' –