配置单元插入查询(如SQL)

配置单元插入查询(如SQL),sql,hadoop,hive,hiveql,Sql,Hadoop,Hive,Hiveql,我不熟悉配置单元,想知道是否有必要像SQL中那样将数据插入配置单元表。我想像这样将数据插入配置单元 INSERT INTO tablename VALUES (value1,value2..) 我已经了解到,您可以将数据从文件加载到配置单元表,也可以将数据从一个表导入到配置单元表,但有没有办法像SQL那样附加数据?否。此插入到tablename值(x,y,z)语法目前在配置单元中不受支持。您不能执行插入到以插入单个记录。它不受配置单元的支持。您可以将要插入的所有新记录放入文件中,并将该文件加载

我不熟悉配置单元,想知道是否有必要像SQL中那样将数据插入配置单元表。我想像这样将数据插入配置单元

INSERT INTO tablename VALUES (value1,value2..)

我已经了解到,您可以将数据从文件加载到配置单元表,也可以将数据从一个表导入到配置单元表,但有没有办法像SQL那样附加数据?

否。此
插入到tablename值(x,y,z)
语法目前在配置单元中不受支持。

您不能执行插入到以插入单个记录。它不受配置单元的支持。您可以将要插入的所有新记录放入文件中,并将该文件加载到配置单元中的临时表中。然后使用insert overwrite..select命令将这些行插入主配置单元表的新分区。这里的约束是必须对主表进行预分区。如果不使用分区,则整个表将被这些新记录替换

我认为在这种情况下,您应该使用HBASE,它有助于此类插入,但不提供任何SQL类型的查询语言。您需要像put方法一样使用HBASE的javaapi来执行此类插入。此外,HBASE是面向列的,没有sql数据库。

您完全可以将数据附加到现有表中。(但它实际上不是HDFS级别的附加)。只是,每当您在现有配置单元表上执行加载或插入操作而不使用
OVERWRITE
子句时,新数据将被放入而不替换旧数据。将在对应于该表的目录中为新插入的数据创建一个新文件。例如:

我有一个名为demo.txt的文件,它有两行:

ABC
XYZ
创建一个表并将此文件加载到其中

hive> create table demo(foo string);
hive> load data inpath '/demo.txt' into table demo;
现在,如果我在此表上进行选择,它将给出:

hive> select * from demo;                        
OK    
ABC    
XYZ
假设我还有一个名为demo2.txt的文件,它有:

PQR
我在这个表上再次加载而不使用覆盖

hive> load data inpath '/demo2.txt' into table demo;
现在,如果我现在选择,它会给我

hive> select * from demo;                       
OK
ABC
XYZ
PQR

HTH

您可以使用表格生成函数
stack
将文字值插入表格

首先,您需要一个只包含一行的虚拟表。你可以在limit的帮助下生成它

CREATE TABLE one AS
SELECT 1 AS one
FROM any_table_in_your_database
LIMIT 1;
现在,您可以创建一个具有如下文字值的新表:

CREATE TABLE my_table AS
SELECT stack(3
  , "row1", 1
  , "row2", 2
  , "row3", 3
) AS (column1, column2)
FROM one
;
stack
的第一个参数是生成的行数

还可以向现有表中添加值:

INSERT INTO TABLE my_table
SELECT stack(2
  , "row4", 1
  , "row5", 2
) AS (column1, column2)
FROM one
;

是的,您可以插入,但与SQL不同

在SQL中,我们可以插入行级数据,但在这里可以按字段(列)插入

在此期间,您必须确保目标表和查询应具有相同的数据类型和相同的列数

例如:


您可以使用下面的方法。这样,您就不需要创建临时表或txt/csv文件来分别进行进一步的选择和加载

INSERT INTO TABLE tablename SELECT value1,value2 FROM tempTable_with_atleast_one_records LIMIT 1.
其中至少有一条记录的表是任何至少有一条记录的表

但这种方法的问题是,如果您有INSERT语句,它插入多行,就像下面的一行一样

INSERT INTO yourTable values (1 , 'value1') , (2 , 'value2') , (3 , 'value3') ;
然后,需要为每行使用单独的INSERT配置单元语句。见下文

INSERT INTO TABLE yourTable SELECT 1 , 'value1' FROM tempTable_with_atleast_one_records LIMIT 1;
INSERT INTO TABLE yourTable SELECT 2 , 'value2' FROM tempTable_with_atleast_one_records LIMIT 1;
INSERT INTO TABLE yourTable SELECT 3 , 'value3' FROM tempTable_with_atleast_one_records LIMIT 1;

unique2建议的稍好版本如下:

insert overwrite table target_table
select * from 
(
select stack(
    3,                 # generating new table with 3 records
    'John', 80,        # record_1
    'Bill', 61         # record_2
    'Martha', 101      # record_3
    ) 
) s;

它不需要使用已经存在的表进行破解。

这里的一些答案在Hive 0.14中已经过时

现在可以使用以下语法插入:

CREATE TABLE students (name VARCHAR(64), age INT, gpa DECIMAL(3, 2));

INSERT INTO TABLE students
  VALUES ('fred flintstone', 35, 1.28), ('barney rubble', 32, 2.32);

表1
中插入
表2
的全部数据。以下是一个问题:

INSERT INTO TABLE table1 SELECT * FROM table2; 

输入以下命令以在一定条件下将数据插入testlog表:

INSERT INTO TABLE testlog SELECT * FROM table1 WHERE some condition;

是的,我们可以在配置单元中使用插入查询

hive> create table test (id int, name string);
插入:插入…值从0.14版开始提供

hive> insert into table test values (1,'mytest');
这适用于
insert
。我们必须使用
关键字


注意:用户不能使用
insert-into…VALUES
子句将数据插入复杂的数据类型列(数组、映射、结构、联合)。

将数据插入配置单元表的方法: 为了演示,我使用表名作为表1表2

1)
从表1中选择*创建表2,其中1=1
从表1中选择*创建表2

2)
插入覆盖表table2从表1中选择*
--它将数据从一个插入到另一个。注意:它将刷新目标

3)
插入表2,从表1中选择*
--它将数据从一个插入到另一个。注意:它将附加到目标中

4)
将数据本地输入路径'local_path'覆盖加载到表1中
--它将本地数据加载到目标表中,并刷新目标表

5)
将路径“hdfs\u path”中的数据加载到表1中
--它将从hdfs位置I加载数据,并刷新目标表。
或

create table table2(
    col1 string,
    col2 string,
    col3 string)
    row format delimited fields terminated by ','
    location 'hdfs_location'; 
6)
将数据本地输入路径'local_path'加载到表1中
--它将从本地加载数据,并附加到目标表中

7)
将路径“hdfs\u path”中的数据加载到表1中
--它将从hdfs位置加载数据,并附加到目标表中

8)
插入表2中的值('aa'、'bb'、'cc')
--假设表2只有3列


9) 多次插入到配置单元表中

您仍然可以在配置单元中插入到复杂类型中-它可以正常工作 (id为int,为数组)


插入emp(id,同事)选择11,数组('Alex','Jian')from(选择'1')

您也可以向特定列添加值,只需指定要在其中添加相应值的列名:

Insert into Table (Col1, Col2, Col4,col5,Col7) Values ('Va11','Va2','Val4','Val5','Val7');

确保跳过的列没有空值类型。

要使配置单元表支持ACID属性并像SQL中那样将值插入表中,几乎没有要设置的属性

在配置单元中创建ACID表的条件

  • 这张桌子应该放在仓库里
    Insert into Table (Col1, Col2, Col4,col5,Col7) Values ('Va11','Va2','Val4','Val5','Val7');
    
    set hive.support.concurrency =true;
    set hive.enforce.bucketing =true;
    set hive.exec.dynamic.partition.mode =nonstrict
    set hive.compactor.initiator.on = true;
    set hive.compactor.worker.threads= 1;
    set hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
    
    CREATE TABLE table_name (col1 int,col2 string, col3 int) CLUSTERED BY col1 INTO 4 
    
    BUCKETS STORED AS orc tblproperties('transactional' ='true');