2017-05-31 6 views
1

私は空の外部ハイブテーブルを作成したいクラスタモードの糸クラスターにspark sql 2.1.1ジョブを持っています(後の手順で場所を追加するパーティションが追加されます)。ロケーションを持たない外部ハイブテーブルを作成するには?

CREATE EXTERNAL TABLE IF NOT EXISTS new_table (id BIGINT, StartTime TIMESTAMP, EndTime TIMESTAMP) PARTITIONED BY (year INT, month INT, day INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 

私はエラーを取得し、ジョブを実行します。

CREATE EXTERNAL TABLE must be accompanied by LOCATION

しかし、私は色相にハイブエディタ上で同じクエリを実行すると、それだけで正常に動作します。私はSparkSQL 2.1.1のドキュメントで答えを見つけようとしていましたが、空の状態になりました。

Spark SQLのクエリが厳しい理由は誰にも分かりますか?

+0

ただ、そのことについては –

+0

P.S.をテーブルのルートフォルダまたは任意の場所を使用場所のないテーブルのようなものはありません。場所を定義していない場合は、デフォルトのパスが使用されています。 –

答えて

1

TL; DREXTERNALなしLOCATIONis not allowedを有する。

最終的な答えは、Spark SQLの文法定義ファイルSqlBase.g4です。

あなたはcreateTableHeaderとしてCREATE EXTERNAL TABLEの定義を見つけることができます:

CREATE TEMPORARY? EXTERNAL? TABLE (IF NOT EXISTS)? tableIdentifier 

この定義は、サポートされているSQL statementsに使用されています。

私が間違っていない限り、locationSpecはオプションです。それはANTLR文法によるものです。コードがそうでないと決めるかもしれません。

scala> spark.version 
res4: String = 2.3.0-SNAPSHOT 

val q = "CREATE EXTERNAL TABLE IF NOT EXISTS new_table (id BIGINT, StartTime TIMESTAMP, EndTime TIMESTAMP) PARTITIONED BY (year INT, month INT, day INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'" 
scala> sql(q) 
org.apache.spark.sql.catalyst.parser.ParseException: 
Operation not allowed: CREATE EXTERNAL TABLE must be accompanied by LOCATION(line 1, pos 0) 

== SQL == 
CREATE EXTERNAL TABLE IF NOT EXISTS new_table (id BIGINT, StartTime TIMESTAMP, EndTime TIMESTAMP) PARTITIONED BY (year INT, month INT, day INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' 
^^^ 

    at org.apache.spark.sql.catalyst.parser.ParserUtils$.operationNotAllowed(ParserUtils.scala:39) 
    at org.apache.spark.sql.execution.SparkSqlAstBuilder$$anonfun$visitCreateHiveTable$1.apply(SparkSqlParser.scala:1096) 
    at org.apache.spark.sql.execution.SparkSqlAstBuilder$$anonfun$visitCreateHiveTable$1.apply(SparkSqlParser.scala:1064) 
    at org.apache.spark.sql.catalyst.parser.ParserUtils$.withOrigin(ParserUtils.scala:99) 
    at org.apache.spark.sql.execution.SparkSqlAstBuilder.visitCreateHiveTable(SparkSqlParser.scala:1064) 
    at org.apache.spark.sql.execution.SparkSqlAstBuilder.visitCreateHiveTable(SparkSqlParser.scala:55) 
    at org.apache.spark.sql.catalyst.parser.SqlBaseParser$CreateHiveTableContext.accept(SqlBaseParser.java:1124) 
    at org.antlr.v4.runtime.tree.AbstractParseTreeVisitor.visit(AbstractParseTreeVisitor.java:42) 
    at org.apache.spark.sql.catalyst.parser.AstBuilder$$anonfun$visitSingleStatement$1.apply(AstBuilder.scala:71) 
    at org.apache.spark.sql.catalyst.parser.AstBuilder$$anonfun$visitSingleStatement$1.apply(AstBuilder.scala:71) 
    at org.apache.spark.sql.catalyst.parser.ParserUtils$.withOrigin(ParserUtils.scala:99) 
    at org.apache.spark.sql.catalyst.parser.AstBuilder.visitSingleStatement(AstBuilder.scala:70) 
    at org.apache.spark.sql.catalyst.parser.AbstractSqlParser$$anonfun$parsePlan$1.apply(ParseDriver.scala:69) 
    at org.apache.spark.sql.catalyst.parser.AbstractSqlParser$$anonfun$parsePlan$1.apply(ParseDriver.scala:68) 
    at org.apache.spark.sql.catalyst.parser.AbstractSqlParser.parse(ParseDriver.scala:97) 
    at org.apache.spark.sql.execution.SparkSqlParser.parse(SparkSqlParser.scala:48) 
    at org.apache.spark.sql.catalyst.parser.AbstractSqlParser.parsePlan(ParseDriver.scala:68) 
    at org.apache.spark.sql.SparkSession.sql(SparkSession.scala:623) 
    ... 48 elided 

SparkSqlAstBuilderなどastBuilder付き)デフォルトSparkSqlParserが例外につながるfollowing assertionを持っている:あなたはケースと思われる場合

if (external && location.isEmpty) { 
    operationNotAllowed("CREATE EXTERNAL TABLE must be accompanied by LOCATION", ctx) 

私はSpark's JIRAに問題を報告して検討したいです許可されるべきです。サポートしているために強力な引数を持っているSPARK-2825を参照してください。

CREATE EXTERNAL TABLE already works as far as I know and should have the same semantics as Hive.

関連する問題