主キーを使用して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は '(' 'の近くの入力を認識できません列指定の名前 ''文字列 '
私を助けてください。
公式ページから: 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
);
申し訳ありませんが、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;
古いバージョンの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
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
を一意と見なし、操作を実行します。
まず、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 ',';
Hiveには主キーと外部キーがないので、主キーを削除して実行します。
テーブルexmp(name string);を作成します。