Hadoop 无法使用主键创建配置单元表

Hadoop 无法使用主键创建配置单元表,hadoop,hive,hiveql,Hadoop,Hive,Hiveql,我无法使用主键在配置单元中创建外部表。下面是示例代码: hive> create table exmp((name string),primary key(name)); 这将返回以下错误消息: NoviableException(278@[])位于 org.apache.hadoop.hive.ql.parse.HiveParser\u IdentifiersParser.identifier(HiveParser\u IdentifiersParser.java:11216)位于 o

我无法使用主键在配置单元中创建外部表。下面是示例代码:

hive> create table exmp((name string),primary key(name));
这将返回以下错误消息:

NoviableException(278@[])位于 org.apache.hadoop.hive.ql.parse.HiveParser\u IdentifiersParser.identifier(HiveParser\u IdentifiersParser.java:11216)位于 org.apache.hadoop.hive.ql.parse.HiveParser.identifier(HiveParser.java:35977) 位于org.apache.hadoop.hive.ql.parse.HiveParser.columnNameType(HiveParser.java:31169) 位于org.apache.hadoop.hive.ql.parse.HiveParser.columnNameTypeList(HiveParser.java:29373) 位于org.apache.hadoop.hive.ql.parse.HiveParser.createTableStatement(HiveParser.java:4439) 位于org.apache.hadoop.hive.ql.parse.HiveParser.ddlStatement(HiveParser.java:2084) 位于org.apache.hadoop.hive.ql.parse.HiveParser.execStatement(HiveParser.java:1344) 位于org.apache.hadoop.hive.ql.parse.HiveParser.statement(HiveParser.java:983) 位于org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:190) 位于org.apache.hadoop.hive.ql.Driver.compile(Driver.java:434) 位于org.apache.hadoop.hive.ql.Driver.compile(Driver.java:352) 位于org.apache.hadoop.hive.ql.Driver.compileInternal(Driver.java:995) 位于org.apache.hadoop.hive.ql.Driver.runInternal(Driver.java:1038) 位于org.apache.hadoop.hive.ql.Driver.run(Driver.java:931) 位于org.apache.hadoop.hive.ql.Driver.run(Driver.java:921) 位于org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:268) 位于org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:220) 位于org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:422) 位于org.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:790) 位于org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:684) 位于org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:623) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中 位于java.lang.reflect.Method.invoke(Method.java:483) 在org.apache.hadoop.util.RunJar.main(RunJar.java:212)失败:ParseException行1:18无法识别“(“”名称”附近的输入 列规范中的“字符串”

请帮帮我。

试试这个

create table exmp(name string,primary key(name));
create table table_name (
    row_number() over() as rowId     operation
    name string,
    age Int,
    address string) row format delimited fields terminated by ',' stored as textfile;

配置单元中没有任何主键和外键。因此请删除主键并执行


创建表exmp(名称字符串);

很抱歉,如果您有任何其他与配置单元表相关的功能,那么配置单元中没有主键

CREATE DATABASE [IF NOT EXISTS] userdb;

SHOW DATABASES;

DROP DATABASE IF EXISTS userdb;

DROP DATABASE IF EXISTS userdb CASCADE;

CREATE TABLE IF NOT EXISTS employee ( eid int, name String,
 salary String, destination String)
 COMMENT "Employee details"
 ROW FORMAT DELIMITED
 FIELDS TERMINATED BY "\t"
 LINES TERMINATED BY "\n"
 STORED AS TEXTFILE;  

LOAD DATA LOCAL INPATH '/home/user/sample.txt'
    OVERWRITE INTO TABLE employee;

ALTER TABLE employee RENAME TO emp;

desc tablename;

ALTER TABLE employee CHANGE name ename String;
hive> ALTER TABLE employee CHANGE salary salary Double;

ALTER TABLE employee ADD COLUMNS ( 
    dept STRING COMMENT 'Department name');    

ALTER TABLE employee REPLACE COLUMNS ( 
    eid INT empid Int, 
    ename STRING name String);

DROP TABLE IF EXISTS employee;

SHOW TABLES;

SELECT * FROM employee WHERE Salary>40000 && Dept=TP;  

CREATE VIEW emp_30000 AS
    SELECT * FROM employee
    WHERE salary>30000;

DROP VIEW emp_30000;  

首先,hive中的derby没有密钥 第二,某些关键字可能与配置单元中的关键字重复,您必须向它们添加单引号。 对于我的情况,我得到了查询错误

  create table NYSE (exchange String,stock_symbol String,stock_date String,stock_price_open double, stock_price_high double, stock_price_low double, stock_price_close double, stock_volume double, stock_price_adj_close double) row format delimited fields terminated by ‘,’;
应该是

  create table NYSE (`exchange` String,stock_symbol String,stock_date String,stock_price_open double, stock_price_high double, stock_price_low double, stock_price_close double, stock_volume double, stock_price_adj_close double) row format delimited fields terminated by ',';
从官方网页:

它们在创建表的语法中包括:

constraint_specification:
  : [, PRIMARY KEY (col_name, ...) DISABLE NOVALIDATE ]
    [, CONSTRAINT constraint_name FOREIGN KEY (col_name, ...) REFERENCES 
table_name(col_name, ...) DISABLE NOVALIDATE .
这意味着我们可以在配置单元中创建带有主键的表

版本信息

从Hive 2.1.0(Hive-13290)起

配置单元包括对未经验证的主键和外键约束的支持。 当存在约束时,某些SQL工具会生成更高效的查询。 由于这些约束未经验证,上游系统需要确保 数据在加载到配置单元之前保持完整性。 例如:

创建表pk(
id1整数,
id2整数,
主键(id1、id2)禁用novalidate
);
创建表fk(
id1整数,
id2整数,
约束c1外键(id1,id2)引用pk(id2,id1)禁用novalidate
);

配置单元中没有主键概念,因为它不是数据库,配置单元中的操作基于文件而不是记录

试试这个

create table exmp(name string,primary key(name));
create table table_name (
    row_number() over() as rowId     operation
    name string,
    age Int,
    address string) row format delimited fields terminated by ',' stored as textfile;

这里考虑<代码> RoWID为唯一并执行操作。

蜂巢的旧版本不支持主键,但此支持已添加到HIVE 2.1.0版本中。因此,这里是对它的示例查询

创建表\u名称(
id int,
名称字符串,
系弦,
主键(id)禁用novalidate
);

PS:如何获取hive的版本

hive——版本
蜂巢1.2.1000.x.x.x.xxxx-x

或者进入直线并击球

直线

Apache Hive的Beeline版本1.2.1000.x.x.x.xxxx-x

Hive没有主键。请纠正我的错误,在sqoop合并时,我遇到了数据丢失,而没有主键在Hive表中。sqoop独立于Hive表定义处理合并键,因此不需要(或功能)为此目的将主键分配给配置单元表。如果存在Sqoop合并问题,则这完全是另一个问题。主键从配置单元版本2.1.0开始出现在配置单元中。在配置单元版本2.1.0之前,尝试使用
主键将导致错误。