将数据插入到Hive表中。

16

我使用Cygwin发行版安装了Hadoop 0.20.3和Hive 0.11.0。

首先,我不知道如何使用Hive CLI:

hive> show tables;

然后输入命令后没有任何反应。我可以使用hive -e/-f执行查询。

接着,我创建了一张表:

CREATE TABLE tweet_table(
tweet STRING
)
COMMENT 'Table of string'

但是我该如何向这个表中插入数据呢?我看到一些INSERT INTO的例子,但当我尝试时:

INSERT INTO TABLE tweet_table (tweet) VALUES ("data")

我遇到了一个错误:

FAILED: ParseException line 1:30 cannot recognize input near '(' 'tweet' ')' in select clause

我该如何在我的表中添加数据?

5个回答

43

你可以通过两种方式向表中插入新数据。

  1. 使用load命令将文件的数据加载到表中。

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename.
  • 您可以使用select查询将新数据插入到表中。

  • INSERT INTO table tablename1 select columnlist FROM secondtable;
    

    1
    那么,LOAD 用于新闻数据的加载,而 INSERT INTO 用于已存在于另一个表中的数据? - Apaachee
    如果我有一个文件,其中一行等于我的Hive表的一行(STRING tweet),那么我该如何正确地插入我的数据? - Apaachee
    你将拥有一个单列表格,以便可以将每一行加载为一行。 - Balaswamy Vaddeman
    谢谢Balaswamy。但是有两个问题我不太清楚。首先,文件必须在第一次上传到集群中,才能在第二次加载时使用,我不知道该怎么做。其次,每次想要将数据存储在Hive中,我都必须将数据存储在文件中吗?如果我每秒有3个加载查询...这不是最优的解决方案吧? - Apaachee
    根据我的理解,Hive的过程是这样的:您无需将数据上传到集群,甚至可以指定本地文件,以便将本地数据上传到Hive。回答第二个问题,是的,我们每次都在处理文件。但是所有这些操作都非常快速,您很少会在这里遇到性能问题。 - Balaswamy Vaddeman

    5

    尝试在数据中使用单引号:

    insert into table test_hive values ('1','puneet');
    

    除了这个答案,没有其他简单的答案。 - Ashish Doneriya

    4

    如果您已经有一个名为pre_loaded_tbl的表并且其中包含一些数据。您可以使用以下查询来将数据加载到您的表中。

    INSERT INTO TABLE tweet_table 
      SELECT  "my_data" AS my_column 
        FROM   pre_loaded_tbl 
       LIMIT   5;
    

    请注意,“my_data”与pre_loaded_tbl中的任何数据都是独立的。您可以选择任何数据并编写任何列名称(这里是my_data和my_column)。Hive不要求它具有相同的列名称。但是,select语句的结构应与tweet_table相同。您可以使用限制确定可以向tweet_table中插入多少次。
    但是,如果您尚未创建任何表,则必须使用文件复制或load data命令在上面的答案中加载数据。

    这个和@Balaswamy Vaddeman的答案有什么区别? - Tariq
    上面的答案展示了如何插入任意数据,而不需要在第二个表中有相同的数据。 - Animesh Raj Jha

    2
    如果表没有分区,则代码如下:
    插入到表table_name中选择col_a,col_b,col_c从another_table(source table) --可以应用任何条件,例如limit, group by, order by等...
    如果表有分区,则代码如下:
    set hive.exec.dynamic.partition=true; set hive.exec.dynamic.partition.mode=nonstrict;
    插入到表table_name的分区(partition_col1, paritition_col2)中选择col_a,col_b,col_c,partition_col1,partition_col2从another_table(source table) --可以应用任何条件,例如limit, group by, order by等...

    0

    虽然有一个被接受的答案,但是我想补充一下,从Hive 0.14开始,允许进行记录级别操作。正确的语法和查询应该是:

    INSERT INTO TABLE tweet_table VALUES ('data');
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接