Github user gatorsmile commented on a diff in the pull request:
https://github.com/apache/spark/pull/18975#discussion_r136256422
--- Diff:
sql/core/src/main/scala/org/apache/spark/sql/execution/SparkSqlParser.scala ---
@@ -1509,4 +1509,84 @@ class SparkSqlAstBuilder(conf: SQLConf) extends
AstBuilder(conf) {
query: LogicalPlan): LogicalPlan = {
RepartitionByExpression(expressions, query, conf.numShufflePartitions)
}
+
+ /**
+ * Return the parameters for [[InsertIntoDir]] logical plan.
+ *
+ * Expected format:
+ * {{{
+ * INSERT OVERWRITE DIRECTORY
+ * [path]
+ * [OPTIONS table_property_list]
+ * select_statement;
+ * }}}
+ */
+ override def visitInsertOverwriteDir(
+ ctx: InsertOverwriteDirContext): InsertDirParams = withOrigin(ctx) {
+ val options =
Option(ctx.options).map(visitPropertyKeyValues).getOrElse(Map.empty)
+ var storage = DataSource.buildStorageFormatFromOptions(options)
+
+ val path = Option(ctx.path) match {
+ case Some(s) => string(s)
+ case None => ""
+ }
+
+ if (!path.isEmpty && storage.locationUri.isDefined) {
+ throw new ParseException(
+ "Directory path and 'path' in OPTIONS are both used to indicate
the directory path, " +
+ "you can only specify one of them.", ctx)
+ }
+ if (path.isEmpty && !storage.locationUri.isDefined) {
+ throw new ParseException(
+ "You need to specify directory path or 'path' in OPTIONS, but not
both", ctx)
+ }
+
+ if (!path.isEmpty) {
+ val customLocation = Some(CatalogUtils.stringToURI(path))
+ storage = storage.copy(locationUri = customLocation)
+ }
+
+ val provider = ctx.tableProvider.qualifiedName.getText
+
+ (false, storage, Some(provider))
+ }
+
+ /**
+ * Return the parameters for [[InsertIntoDir]] logical plan.
+ *
+ * Expected format:
+ * {{{
+ * INSERT OVERWRITE [LOCAL] DIRECTORY
+ * path
+ * [ROW FORMAT row_format]
+ * [STORED AS file_format]
+ * select_statement;
+ * }}}
+ */
+ override def visitInsertOverwriteHiveDir(
+ ctx: InsertOverwriteHiveDirContext): InsertDirParams =
withOrigin(ctx) {
+ validateRowFormatFileFormat(ctx.rowFormat, ctx.createFileFormat, ctx)
+ val rowStorage = Option(ctx.rowFormat).map(visitRowFormat)
+ .getOrElse(CatalogStorageFormat.empty)
+ val fileStorage =
Option(ctx.createFileFormat).map(visitCreateFileFormat)
+ .getOrElse(CatalogStorageFormat.empty)
+
+ val path = string(ctx.path)
+ // The path field is required
+ if (path.isEmpty) {
+ operationNotAllowed("INSERT OVERWRITE DIRECTORY must be accompanied
by path", ctx)
+ }
+
+ val defaultStorage = HiveSerDe.getDefaultStorage(conf)
+
+ val storage = CatalogStorageFormat(
+ locationUri = Some(CatalogUtils.stringToURI(path)),
+ inputFormat =
fileStorage.inputFormat.orElse(defaultStorage.inputFormat),
+ outputFormat =
fileStorage.outputFormat.orElse(defaultStorage.outputFormat),
+ serde =
rowStorage.serde.orElse(fileStorage.serde).orElse(defaultStorage.serde),
+ compressed = false,
+ properties = rowStorage.properties ++ fileStorage.properties)
+
+ (ctx.LOCAL != null, storage, None)
--- End diff --
This command should be equivalent to the above command with the `USING
hive` clause.
We need to make these two methods interchangeable for Hive commands. See
what we did in the following example:
https://github.com/apache/spark/blob/master/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveDDLSuite.scala#L1440-L1448
---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]