web-dev-qa-db-ja.com

主キーでHiveテーブルを作成できません

主キーを使用してHiveで外部テーブルを作成できません。サンプルコードは次のとおりです。

Hive> create table exmp((name string),primary key(name));

これにより、次のエラーメッセージが返されます。

NoViableAltException(278 @ [])at org.Apache.hadoop.Hive.ql.parse.HiveParser_IdentifiersParser.identifier(HiveParser_IdentifiersParser.Java:11216)at org.Apache.hadoop.Hive.ql.parse.HiveParser.identifier(HiveParser.Java :35977)at org.Apache.hadoop.Hive.ql.parse.HiveParser.columnNameType(HiveParser.Java:31169)at org.Apache.hadoop.Hive.ql.parse.HiveParser.columnNameTypeList(HiveParser.Java:29373)at org.Apache.hadoop.Hive.ql.parse.HiveParser.ddlStatement(HiveParser.Java:2084)at org.Apacheのorg.Apache.hadoop.Hive.ql.parse.HiveParser.createTableStatement(HiveParser.Java:4439) hadoop.Hive.ql.parse.HiveParser.execStatement(HiveParser.Java:1344)at org.Apache.hadoop.Hive.ql.parse.HiveParser.statement(HiveParser.Java:983)atorg.Apache.hadoop.Hive。 ql.parse.ParseDriver.parse(ParseDriver.Java:190)at org.Apache.hadoop.Hive.ql.Driver.compile(Driver.Java:434)at org.Apache.hadoop.Hive.ql.Driver.compile( Driver.Java:352)at org.Apache.hadoop.Hive.ql.Driver.compileInternal(Driver.Java:995)at org.A pache.hadoop.Hive.ql.Driver.runInternal(Driver.Java:1038)at org.Apache.hadoop.Hive.ql.Driver.run(Driver.Java:931)atorg.Apache.hadoop.Hive.ql。 Driver.run(Driver.Java:921)at org.Apache.hadoop.Hive.cli.CliDriver.processLocalCmd(CliDriver.Java:268)at org.Apache.hadoop.Hive.cli.CliDriver.processCmd(CliDriver.Java: 220)org.Apache.hadoop.Hive.cli.CliDriver.processLine(CliDriver.Java:422)at org.Apache.hadoop.Hive.cli.CliDriver.executeDriver(CliDriver.Java:790)at org.Apache.hadoop .Hive.cli.CliDriver.run(CliDriver.Java:684)at org.Apache.hadoop.Hive.cli.CliDriver.main(CliDriver.Java:623)at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at Sun .reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)at Java.lang.reflect.Method.invoke(Method.Java:483)atorg.Apache。 hadoop.util.RunJar.main(RunJar.Java:212)失敗:ParseException行1:18は '(' 'の近くの入力を認識できません列指定の名前 ''文字列 '

私を助けてください。

6
Hussain Shaik

公式ページから: https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+DDL

それらは、テーブルを作成するための構文に次のように含まれています。

constraint_specification:
  : [, PRIMARY KEY (col_name, ...) DISABLE NOVALIDATE ]
    [, CONSTRAINT constraint_name FOREIGN KEY (col_name, ...) REFERENCES 
table_name(col_name, ...) DISABLE NOVALIDATE .

つまり、Hiveで主キーを使用してテーブルを作成できるということです。

バージョン情報

Hive 2.1.0(Hive-13290)以降。

Hiveには、検証されていない主キーと外部キーの制約のサポートが含まれています。一部のSQLツールは、制約が存在する場合に、より効率的なクエリを生成します。これらの制約は検証されていないため、アップストリームシステムはデータをHiveにロードする前にデータの整合性を確保する必要があります。例:

CREATE TABLE pk(
    id1 integer,
    id2 integer,
    primary key(id1, id2) disable novalidate
);

CREATE TABLE fk(
    id1 integer,
    id2 integer,
    constraint c1 foreign key(id1, id2) references pk(id2, id1) disable novalidate
);
2
G.v. Sridhar

申し訳ありませんが、Hiveテーブルに関連する他の機能がこれを通過した場合、Hiveには主キーがありません

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;  
2
arshad Khan

古いバージョンのHiveは主キーをサポートしていませんが、このサポートは2.1.0バージョンのHiveで追加されました。だからここにそれのためのサンプルクエリがあります

CREATE TABLE table_name ( id int, name string, dept string, primary key(id) disable novalidate );

PS:Hiveのバージョンを入手する方法

Hive --version Hive 1.2.1000.x.x.x.xxxx-x

またはビーラインに入り、ヒット

beeline Beeline version 1.2.1000.x.x.x.xxxx-x by Apache Hive

2
Pardeep Dogra

Hiveはデータベースではなく、Hiveの操作はレコードベースではなくファイルベースであるため、主キーの概念はありません。

これを試して

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を一意と見なし、操作を実行します。

0
Dhrub Thakur

まず、Hiveのダービーにはキーがありません。次に、一部のキーがHiveのキーワードと重複している可能性があり、一重引用符を追加する必要があります。私の場合、クエリでエラーが発生します

  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 ',';
0
truongpmcs

Hiveには主キーと外部キーがないので、主キーを削除して実行します。

テーブルexmp(name string);を作成します。