【问题标题】:Hive: filter a table using another tableHive:使用另一个表过滤一个表
【发布时间】:2018-10-30 03:01:42
【问题描述】:

我对 hive 和 sql 非常陌生,我对如何处理以下问题有疑问:

我有桌子 A:

Name    id

Amy     1
Bob     4
Josh    9
Sam     6

我想使用另一个表(表 B)中的值对其进行过滤:

Value  id

.2     4
.7     6

要获得一个看起来像表 A 但只包含在 id 列中的值也出现在表 B 的 id 列中的行的新表:

Name    id

Bob     4
Sam     6

所以我假设我会写一些类似...的东西

CREATE TABLE Table C AS
SELECT * FROM Table A
WHERE id....

【问题讨论】:

    标签: sql filter hive


    【解决方案1】:

    加入吧..

    hive> CREATE TABLE TableC AS           
        > SELECT A.* FROM TableA as A,
        > TableB as B                       
        > WHERE A.id = B.id;
    
    hive> SELECT * FROM TableC;
    OK
    Bob 4
    Sam 6
    

    或者试试这个,

    hive> CREATE TABLE TableD AS           
        > SELECT A.* FROM TableA as A join
        > TableB as B                       
        > on A.id = B.id;
    
    hive> SELECT * FROM TableD;
    OK
    Bob 4
    Sam 6
    

    【讨论】:

    • 我尝试运行以下命令:CREATE TABLE tableC AS SELECT A.* FROM tableA as A, tableB as B WHERE A.id = B.2; 并得到error while compiling statement: failed: parseexception line 2:34 missing eof at ',' near 'a' 我觉得我经常遇到这种错误。它与我正在运行的 Hive 版本有关吗?或者这在 SQL 中有效但在 Hive 中无效?
    • 看你的查询,你写了WHERE A.id = B.2,写了WHERE A.id = B.id
    • 这不是问题,我正在编辑变量名,只是打错了。
    • 第二个解决方案运行没有错误,但返回的表比我开始时的行数多
    • 写内连接而不是连接
    【解决方案2】:

    使用以下列创建了两个表

    CREATE TABLE TABLE_1 
    ( NAMES VARCHAR2(10) NOT NULL,
    ID_1 NUMBER (2) NOT NULL)
    
    CREATE TABLE TABLE_2 
    ( VALUES_1 VARCHAR2(10) NOT NULL,
    ID_1 NUMBER (2) NOT NULL)
    

    并在这些表中插入值

    最终表应该被创建为

    CREATE TABLE TABLE_3 AS (
    SELECT T1.NAMES,T2.ID_1 FROM TABLE_1 T1,TABLE_2 T2
    WHERE T1.ID_1(+)= T2.ID_1)
    

    【讨论】:

    • 我试过:CREATE TABLE newtable AS SELECT t1.* FROM table1 t1, table2 t2 WHERE t1.id (+)= t2.id);我收到一个错误:编译语句时出错:失败:parseexception line 2:26 cannot identify input near 't1' ',' 'table2' in table source
    • “缺少左括号”错误将会出现,并且表 1 的值 Name id Amy 1 Bob 4 Josh 9 Sam 6 而表 2 的值 Value id .2 4 .7 6
    • 我尝试运行以下,但遇到错误:CREATE TABLE Table_C AS (SELECT a.* FROM table_a a, table_b b WHERE a.id (+)= b.id); 但我在第 2 行收到以下错误:error while compiling statement: failed: parseexception line 2:0 cannot recognize input near '(' 'select' 'a' in select clause
    • 这个语法对我来说是一个错误,它不喜欢 table1_t1 和 table2_t2 之间的逗号
    【解决方案3】:

    我想要的结果的正确语法是:

    CREATE TABLE tableC AS
    SELECT tableA.*
    FROM tableA LEFT SEMI JOIN tableB on (tableA.id = tableB.id);
    

    【讨论】:

      【解决方案4】:

      创建结果表

      CREATE TABLE TABLE3 (Name STRING, id INT)
      ROW FORMAT DELIMITED
      FIELDS TERMINATED BY ','
      STORED AS TEXTFILE;
      

      然后使用 Join 插入到新表中

      INSERT INTO  TABLE TABLE3 SELECT t1.Name, t1.Id from Table1 t1 
      JOIN Table2 t2 WHERE t1.id = t2.id;
      

      会给你想要的结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-29
        • 2013-05-04
        • 1970-01-01
        • 2013-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-27
        相关资源
        最近更新 更多