在hiveql中嵌套选择

kmb7vmvb  于 2021-06-01  发布在  Hadoop
关注(0)|答案(2)|浏览(360)

在我的一个用例中,我有两个表,即flow和conf。flow表包含所有飞行数据的列表。它有creationdate、datafilename、aircraftid列。conf表包含配置信息。它有configdate、aircraftid、ConfigurationName列。为一种飞机类型创建了多个配置版本。因此,当我们处理一个datafilename时,我们需要从flow表中识别aircraftid,并从conf表中提取在datafilename创建之前创建的配置。所以,我试过这个,

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\u date<flow.f\u file\u creation\u 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

有人能给我一个或两个提示我哪里出了问题,以及如何解决这个问题吗?

am46iovg

am46iovg1#

我无法重现你的错误。我想你的问题是正确的。你用什么版本的Hive?我用Hive2.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;
xdyibdwo

xdyibdwo2#

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

请仔细阅读

发布问题
发布数据相关问题时-
提供数据样本:源数据+所需结果。
这将比你给出的任何解释都要清楚。它还将为进一步讨论提供一个共同的背景,并为您和其他人验证给定解决方案的正确性提供一种方法。
提供表的大小属性(记录/卷)。
考虑到ans可能影响给定解决方案的性能,这一点很重要。
sql语句
配置单元当前不支持equijoin以外的任何连接条件类型(例如。 t1.X = t2.X and t1.Y = t2.Y ). 这就是为什么你会出错。
如果要进行内部联接(而不是外部联接),则可以将非等分联接条件移动到where子句。
坚持isosql标准。sql子句有一个常规的顺序:从where中选择。。。
除了深奥的错误消息之外,您从深奥的语法中什么也得不到。
没有任何理由使用子查询来缩小列列表的范围。
只想说清楚一点-这样做并没有任何性能提升。更重要的是,如果它能像你想象的那样工作(而且它没有),那么性能会更差,而不是更好。

相关问题