복붙노트

[HADOOP] hiveQL에서 선택 중첩

HADOOP

hiveQL에서 선택 중첩

내 유스 케이스 중 하나에서, 나는 두 개의 테이블, 즉 흐름의 conf 있습니다. 흐름 테이블은 모든 비행 데이터의 목록이 포함되어 있습니다. 그것은 열에서 CreationDate, 한 DataFileName, aircraftid있다. conf의 테이블 구성 정보가 포함되어 있습니다. 그것은 열 configdate, aircraftid, configurationame있다. 한 기종에 대해 생성 구성의 여러 버전이 있습니다. 우리가 한 DataFileName을 처리 할 때, 우리는 흐름 테이블에서 aircraftid를 식별하고, 한 DataFileName가 생성되기 전에 방금 만든 conf의 테이블에서 구성을 선택해야합니다. 그래서, 나는,이 시도

FROM (
SELECT  
F_FILE_CREATION_DATE,    
F_FILE_ARCHIVED_RELATIVE_PATH,   
F_FILE_ARCHIVED_NAME,   
K_AIRCRAFT   
from T_FLOW f )x left join 
(
  select c.config_date, c.aircraft_id, c.configurationfrom t_conf c
) y on y.aircraft_id = x.K_AIRCRAFT 
select    
x.F_FILE_CREATION_DATE,  
x.F_FILE_ARCHIVED_RELATIVE_PATH,   
x.F_FILE_ARCHIVED_NAME,   
x.K_AIRCRAFT,   
y.config_date,
y.aircraft_id,
y.configuration;

conf.config_date

 FROM (
SELECT  
F_FILE_CREATION_DATE,    
F_FILE_ARCHIVED_RELATIVE_PATH,   
F_FILE_ARCHIVED_NAME,   
K_AIRCRAFT   
from T_FLOW f )x join 
(
  select c.config_date, c.aircraft_id, c.FILEFILTER from t_conf c
) y on y.aircraft_id = x.K_AIRCRAFT  where y.config_date < x.f_file_creation_date    
select    
x.F_FILE_CREATION_DATE,  
x.F_FILE_ARCHIVED_RELATIVE_PATH,   
x.F_FILE_ARCHIVED_NAME,   
x.K_AIRCRAFT,   
y.config_date,
y.aircraft_id,
y.filefilter;

이 시간은 오류로 인해 실패

 required (...)+ loop did not match anything at input 'where' in statement

누군가가 나에게 내가 어떻게이 문제를 해결하기 위해 잘못과에 갈거야 힌트 또는 두 줄 수 있습니까?

해결법

  1. ==============================

    1.

    select  f.f_file_creation_date
           ,f.f_file_archived_relative_path   
           ,f.f_file_archived_name
           ,f.k_aircraft
    
           ,c.config_date
           ,c.aircraft_id
           ,c.filefilter
    
    from            t_flow  as f
    
            join   (select  config_date
                           ,aircraft_id
                           ,filefilter
    
                           ,lead (config_date,1,date '3000-01-01') over 
                            (
                                partition by    aircraft_id
                                order by        config_date  
                            )   as next_config_date                        
    
                    from    t_conf
                    ) c
    
            on      c.aircraft_id = 
                    f.k_aircraft
    
    where   f.f_file_creation_date  >=  c.config_date 
        and f.f_file_creation_date  <   c.next_config_date   
    

    질문을 게시

    때 데이터와 관련된 질문을 게시 -

    SQL

  2. ==============================

    2.나는 당신의 오류를 재현 할 수 없습니다. 나는 당신의 쿼리가 유효 같아요. 당신은 하이브 어떤 버전을 사용합니까? 나는 하이브 2.1.1이 쿼리를 테스트했다.

    나는 당신의 오류를 재현 할 수 없습니다. 나는 당신의 쿼리가 유효 같아요. 당신은 하이브 어떤 버전을 사용합니까? 나는 하이브 2.1.1이 쿼리를 테스트했다.

    DROP TABLE IF EXISTS t_flow;
    CREATE TABLE IF NOT EXISTS t_flow (
        f_file_creation_date            DATE
        , f_file_archived_relative_path STRING
        , f_file_archived_name          STRING
        , k_aircraft                    STRING
    );
    
    -- Conf table contains configuration information.
    -- It has columns configdate, aircraftid, configurationame
    DROP TABLE IF EXISTS t_conf;
    CREATE TABLE IF NOT EXISTS t_conf (
        config_date   DATE
        , aircraft_id STRING
        , filefilter  STRING
    );
    
    SELECT
        x.f_file_creation_date,
        x.f_file_archived_relative_path,
        x.f_file_archived_name,
        x.k_aircraft,
        y.config_date,
        y.aircraft_id,
        y.filefilter
    FROM
        (SELECT
            f_file_creation_date,
            f_file_archived_relative_path,
            f_file_archived_name,
            k_aircraft
        FROM t_flow f) x
        JOIN
        (SELECT
        c.config_date,
        c.aircraft_id,
        c.filefilter
        FROM t_conf c) y on y.aircraft_id = x.k_aircraft  where y.config_date < x.f_file_creation_date;
    
  3. from https://stackoverflow.com/questions/44276515/nested-select-in-hiveql by cc-by-sa and MIT license