From 6c7142235fc88180d9471979445abb20ebc3e0d7 Mon Sep 17 00:00:00 2001 From: Denny Lee Date: Wed, 16 Oct 2019 07:44:01 +0000 Subject: [PATCH 01/44] [DELTA-OSS-EXTERNAL] Update Tutorial to attach notebooks Closes delta-io/delta#216 Author: Denny Lee #6697 is resolved by tdas/949oueiv. GitOrigin-RevId: 5f0406e6e968d6a655aa11c696c3a820e55447f6 --- .../tutorials/saiseu19/img/Attach-Notebook.png | Bin 0 -> 614399 bytes examples/tutorials/saiseu19/readme.md | 13 ++++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 examples/tutorials/saiseu19/img/Attach-Notebook.png diff --git a/examples/tutorials/saiseu19/img/Attach-Notebook.png b/examples/tutorials/saiseu19/img/Attach-Notebook.png new file mode 100644 index 0000000000000000000000000000000000000000..ac77816515d829dbb7d6928446301d2c47fdab70 GIT binary patch literal 614399 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 @7mvgd>Ct9b%a`Dp$6;XI-@UI+CX>;AooVxW``) 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

sp)Q@s;yOWC^R{_+j}V<-lVj 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 z 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 literal 0 HcmV?d00001 diff --git a/examples/tutorials/saiseu19/readme.md b/examples/tutorials/saiseu19/readme.md index ebe57e70102..4fe729ba015 100644 --- a/examples/tutorials/saiseu19/readme.md +++ b/examples/tutorials/saiseu19/readme.md @@ -51,7 +51,7 @@ Note, within DBCE, you can only create one cluster at a time. If one already ex -### Import and Attach a Notebook +### Importing Notebooks

Expand to view more details about Importing Notebooks @@ -89,3 +89,14 @@ Once you have imported the notebook, your screen should similar to the view belo
+### Attaching Notebooks + +
+Expand to view more details about Attaching Notebooks + + 
  +Near the top left, click the *cluster dropdown* and choose the cluster you want to attach the notebook. + +![](img/Attach-Notebook.png) + +
From 8c4fe42c58b948acb93c0d9418c3cf1df43da431 Mon Sep 17 00:00:00 2001 From: Rahul Mahadev Date: Tue, 22 Oct 2019 19:11:51 -0700 Subject: [PATCH 02/44] [SC-24892] Add typesafe bintray repo for sbt-mima-plugin ## What changes were proposed in this pull request? Adding the `typesafe` bintray repo for `sbt-mima-plugin` since the old `sbt-mima-plugin` was removed. ## How was this patch tested? Run the usual tests Closes #6744 from rahulsmahadev/mimaFix. Lead-authored-by: Rahul Mahadev Co-authored-by: Shixiong Zhu Signed-off-by: Rahul Mahadev GitOrigin-RevId: 9cbdca25128b010f488b880a9cf7f39db89f3b2c --- build/sbt-config/repositories | 1 + project/plugins.sbt | 3 +++ 2 files changed, 4 insertions(+) diff --git a/build/sbt-config/repositories b/build/sbt-config/repositories index dcac6f66c19..f398fda1cea 100644 --- a/build/sbt-config/repositories +++ b/build/sbt-config/repositories @@ -7,5 +7,6 @@ typesafe-ivy-releases: https://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly sbt-ivy-snapshots: https://repo.scala-sbt.org/scalasbt/ivy-snapshots/, [organization]/[module]/[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly sbt-plugin-releases: https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext] + bintray-typesafe-sbt-plugin-releases: https://dl.bintray.com/typesafe/sbt-plugins/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext] bintray-spark-packages: https://dl.bintray.com/spark-packages/maven/ typesafe-releases: http://repo.typesafe.com/typesafe/releases/ diff --git a/project/plugins.sbt b/project/plugins.sbt index acc946c3552..b5afbf66725 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -38,3 +38,6 @@ addSbtPlugin("com.eed3si9n" % "sbt-unidoc" % "0.4.2") addSbtPlugin("com.typesafe" % "sbt-mima-plugin" % "0.3.0") addSbtPlugin("com.simplytyped" % "sbt-antlr4" % "0.7.13") + +resolvers += Resolver.url("typesafe sbt-plugins", + url("https://dl.bintray.com/typesafe/sbt-plugins"))(Resolver.ivyStylePatterns) From 3a95ae8b25753d16735165ee867ec50332883821 Mon Sep 17 00:00:00 2001 From: Andreas Neumann Date: Thu, 24 Oct 2019 19:53:33 +0000 Subject: [PATCH 03/44] [DELTA-OSS-EXTERNAL] [ISSUE#221] Minor fixes for tutorial simple fixes for correctness. Closes delta-io/delta#222 Author: Andreas Neumann #6760 is resolved by mukulmurthy/c1081idg. GitOrigin-RevId: 7c31f1d1d2d0de3f944ba819fdf4b66c771e2ea8 --- .../saiseu19/SAISEu19 - Delta Lake Python Tutorial.py | 4 ++-- .../saiseu19/SAISEu19 - Delta Lake Scala Tutorial.scala | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/tutorials/saiseu19/SAISEu19 - Delta Lake Python Tutorial.py b/examples/tutorials/saiseu19/SAISEu19 - Delta Lake Python Tutorial.py index fd493ee3406..d10f1f5b44d 100644 --- a/examples/tutorials/saiseu19/SAISEu19 - Delta Lake Python Tutorial.py +++ b/examples/tutorials/saiseu19/SAISEu19 - Delta Lake Python Tutorial.py @@ -216,7 +216,7 @@ def stop_all_streams(): # MAGIC Schema is not enforced when writing leading to dirty and often corrupted data. # MAGIC # MAGIC #### 2. No interoperatbility between batch and streaming workloads -# MAGIC Apache Spark's Parquet streaming sink does not maintain enough metadata such that batch workload can seamlessly interact with batch workloads. +# MAGIC Apache Spark's Parquet streaming sink does not maintain enough metadata such that streaming workloads can seamlessly interact with batch workloads. # COMMAND ---------- @@ -425,7 +425,7 @@ def generate_and_append_data_stream_fixed(table_format, table_path): # COMMAND ---------- -# MAGIC %md **Note**: Because we were able to easily `DELETE` the data, the above value should be `null`. +# MAGIC %md **Note**: Because we were able to easily `DELETE` the data, the above value should be `0`. # COMMAND ---------- diff --git a/examples/tutorials/saiseu19/SAISEu19 - Delta Lake Scala Tutorial.scala b/examples/tutorials/saiseu19/SAISEu19 - Delta Lake Scala Tutorial.scala index 0094f93f10a..b4002b7e338 100644 --- a/examples/tutorials/saiseu19/SAISEu19 - Delta Lake Scala Tutorial.scala +++ b/examples/tutorials/saiseu19/SAISEu19 - Delta Lake Scala Tutorial.scala @@ -222,7 +222,7 @@ stopAllStreams() // MAGIC Schema is not enforced when writing leading to dirty and often corrupted data. // MAGIC // MAGIC #### 2. No interoperatbility between batch and streaming workloads -// MAGIC Apache Spark's Parquet streaming sink does not maintain enough metadata such that batch workload can seamlessly interact with batch workloads. +// MAGIC Apache Spark's Parquet streaming sink does not maintain enough metadata such that streaming workloads can seamlessly interact with batch workloads. // COMMAND ---------- @@ -425,7 +425,7 @@ display(spark.sql("SELECT COUNT(*) FROM loans_delta WHERE funded_amnt = paid_amn // COMMAND ---------- -// MAGIC %md **Note**: Because we were able to easily `DELETE` the data, the above value should be `null`. +// MAGIC %md **Note**: Because we were able to easily `DELETE` the data, the above value should be `0`. // COMMAND ---------- From 4d8aa5727f11501b3c15da9ecd650e82cb3aa48f Mon Sep 17 00:00:00 2001 From: Mukul Murthy <38224594+mukulmurthy@users.noreply.github.com> Date: Tue, 29 Oct 2019 01:11:43 +0000 Subject: [PATCH 04/44] [DELTA-OSS-EXTERNAL] Remove unnecessary adding packagedArtifacts to publishM2 @tdas fixed packaging a month ago; so we shouldn't need to add spPublishLocal packagedArtifacts to publishM2 anymore. This also fixes a warning when running build/sbt. Closes delta-io/delta#227 Author: Mukul Murthy <38224594+mukulmurthy@users.noreply.github.com> #6792 is resolved by mukulmurthy/5kvx5nsi. GitOrigin-RevId: 3cfdef4298a245e916cb121009bff634902c0492 --- build.sbt | 2 -- 1 file changed, 2 deletions(-) diff --git a/build.sbt b/build.sbt index 6269df5358b..af4ab712975 100644 --- a/build.sbt +++ b/build.sbt @@ -164,8 +164,6 @@ spIncludeMaven := true spIgnoreProvided := true -packagedArtifacts in publishM2 <<= packagedArtifacts in spPublishLocal - packageBin in Compile := spPackage.value sparkComponents := Seq("sql") From 009c9492d0c729106b1bd7e918beec7c6fa87e23 Mon Sep 17 00:00:00 2001 From: JassAbidi <35536039+JassAbidi@users.noreply.github.com> Date: Wed, 30 Oct 2019 21:05:52 +0000 Subject: [PATCH 05/44] [DELTA-OSS-EXTERNAL] [ISSUE#146] add support for setting dataChange = false This add suuport for setting dataChange parameter when writing to delta table. the dataChange parameter is implemented as a DataFrame writer option. add a test to illustrate the scene of rearranging the data without changing it. - Closes issue #146 Closes delta-io/delta#223 Author: Rahul Mahadev Author: JassAbidi <35536039+JassAbidi@users.noreply.github.com> #6806 is resolved by mukulmurthy/nv7wo55e. GitOrigin-RevId: c65006f57b10788efafccf8b0d6dce19eaf5475d --- .../apache/spark/sql/delta/DeltaOptions.scala | 15 +++++- .../sql/delta/commands/WriteIntoDelta.scala | 8 ++- .../apache/spark/sql/delta/DeltaSuite.scala | 53 +++++++++++++++++++ 3 files changed, 74 insertions(+), 2 deletions(-) diff --git a/src/main/scala/org/apache/spark/sql/delta/DeltaOptions.scala b/src/main/scala/org/apache/spark/sql/delta/DeltaOptions.scala index 3f3e030513f..52c8fe302ea 100644 --- a/src/main/scala/org/apache/spark/sql/delta/DeltaOptions.scala +++ b/src/main/scala/org/apache/spark/sql/delta/DeltaOptions.scala @@ -22,7 +22,7 @@ import java.util.regex.PatternSyntaxException import scala.util.Try import scala.util.matching.Regex -import org.apache.spark.sql.delta.DeltaOptions.{MERGE_SCHEMA_OPTION, OVERWRITE_SCHEMA_OPTION} +import org.apache.spark.sql.delta.DeltaOptions.{DATA_CHANGE_OPTION, MERGE_SCHEMA_OPTION, OVERWRITE_SCHEMA_OPTION} import org.apache.spark.sql.delta.metering.DeltaLogging import org.apache.spark.sql.delta.sources.DeltaSQLConf @@ -77,6 +77,17 @@ trait DeltaWriteOptionsImpl extends DeltaOptionParser { def canOverwriteSchema: Boolean = { options.get(OVERWRITE_SCHEMA_OPTION).map(toBoolean(_, OVERWRITE_SCHEMA_OPTION)).getOrElse(false) } + + /** + * Whether to write new data to the table or just rearrange data that is already + * part of the table. This option declares that the data being written by this job + * does not change any data in the table and merely rearranges existing data. + * This makes sure streaming queries reading from this table will not see any new changes + */ + def rearrangeOnly: Boolean = { + options.get(DATA_CHANGE_OPTION).map(!toBoolean(_, DATA_CHANGE_OPTION)).getOrElse(false) + } + } trait DeltaReadOptions extends DeltaOptionParser { @@ -135,6 +146,7 @@ object DeltaOptions extends DeltaLogging { val IGNORE_CHANGES_OPTION = "ignoreChanges" val IGNORE_DELETES_OPTION = "ignoreDeletes" val OPTIMIZE_WRITE_OPTION = "optimizeWrite" + val DATA_CHANGE_OPTION = "dataChange" val validOptionKeys : Set[String] = Set( REPLACE_WHERE_OPTION, @@ -146,6 +158,7 @@ object DeltaOptions extends DeltaLogging { IGNORE_CHANGES_OPTION, IGNORE_DELETES_OPTION, OPTIMIZE_WRITE_OPTION, + DATA_CHANGE_OPTION, "queryName", "checkpointLocation", "path", diff --git a/src/main/scala/org/apache/spark/sql/delta/commands/WriteIntoDelta.scala b/src/main/scala/org/apache/spark/sql/delta/commands/WriteIntoDelta.scala index 9cc567e327d..635d3bd69d7 100644 --- a/src/main/scala/org/apache/spark/sql/delta/commands/WriteIntoDelta.scala +++ b/src/main/scala/org/apache/spark/sql/delta/commands/WriteIntoDelta.scala @@ -122,6 +122,12 @@ case class WriteIntoDelta( case _ => Nil } - newFiles ++ deletedFiles + val rearrangeOnly = options.rearrangeOnly + if (rearrangeOnly) { + newFiles.map(_.copy(dataChange = !rearrangeOnly)) ++ + deletedFiles.map(_.copy(dataChange = !rearrangeOnly)) + } else { + newFiles ++ deletedFiles + } } } diff --git a/src/test/scala/org/apache/spark/sql/delta/DeltaSuite.scala b/src/test/scala/org/apache/spark/sql/delta/DeltaSuite.scala index 2744dfce260..ec8aa05d892 100644 --- a/src/test/scala/org/apache/spark/sql/delta/DeltaSuite.scala +++ b/src/test/scala/org/apache/spark/sql/delta/DeltaSuite.scala @@ -18,8 +18,10 @@ package org.apache.spark.sql.delta import java.io.{File, FileNotFoundException} +import org.apache.spark.sql.delta.actions.{Action, FileAction} import org.apache.spark.sql.delta.files.TahoeLogFileIndex import org.apache.spark.sql.delta.sources.DeltaSQLConf +import org.apache.spark.sql.delta.util.FileNames import org.apache.hadoop.fs.{FileSystem, Path} import org.apache.spark.SparkException @@ -921,4 +923,55 @@ class DeltaSuite extends QueryTest checkAnswer(spark.table("sc15200test"), Seq.empty) } } + + test("support for setting dataChange to false") { + val tempDir = Utils.createTempDir() + + spark.range(100) + .write + .format("delta") + .save(tempDir.toString) + + val df = spark.read.format("delta").load(tempDir.toString) + + df + .write + .format("delta") + .mode("overwrite") + .option("dataChange", "false") + .save(tempDir.toString) + + val deltaLog = DeltaLog.forTable(spark, tempDir) + val version = deltaLog.snapshot.version + val commitActions = deltaLog.store.read(FileNames.deltaFile(deltaLog.logPath, version)) + .map(Action.fromJson) + val fileActions = commitActions.collect { case a: FileAction => a } + + assert(fileActions.forall(!_.dataChange)) + } + + test("dataChange is by default set to true") { + val tempDir = Utils.createTempDir() + + spark.range(100) + .write + .format("delta") + .save(tempDir.toString) + + val df = spark.read.format("delta").load(tempDir.toString) + + df + .write + .format("delta") + .mode("overwrite") + .save(tempDir.toString) + + val deltaLog = DeltaLog.forTable(spark, tempDir) + val version = deltaLog.snapshot.version + val commitActions = deltaLog.store.read(FileNames.deltaFile(deltaLog.logPath, version)) + .map(Action.fromJson) + val fileActions = commitActions.collect { case a: FileAction => a } + + assert(fileActions.forall(_.dataChange)) + } } From d309dbf1feedab958f9eaa83afa758cea16743c1 Mon Sep 17 00:00:00 2001 From: Burak Yavuz Date: Mon, 4 Nov 2019 22:44:15 +0000 Subject: [PATCH 06/44] [SC-25431][DELTA][TEST] Remove invalid test Remove an accidental test that tests table support. Until Spark 3.0 comes out, Delta cannot support Hive metastore tables. This test was invalid but passing because it tested a trivial behavior. Author: Burak Yavuz GitOrigin-RevId: e903bdbb143eb11cc940fafc8205ef29e86df174 --- .../scala/org/apache/spark/sql/delta/DeltaSuite.scala | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/test/scala/org/apache/spark/sql/delta/DeltaSuite.scala b/src/test/scala/org/apache/spark/sql/delta/DeltaSuite.scala index ec8aa05d892..0496a247c17 100644 --- a/src/test/scala/org/apache/spark/sql/delta/DeltaSuite.scala +++ b/src/test/scala/org/apache/spark/sql/delta/DeltaSuite.scala @@ -916,14 +916,6 @@ class DeltaSuite extends QueryTest } } - test("SC-15200: SaveAsTable on empty dataframe should create table") { - withTable("sc15200test") { - spark.range(0).selectExpr("id", "id as id2") - .write.format("delta").partitionBy("id").saveAsTable("sc15200test") - checkAnswer(spark.table("sc15200test"), Seq.empty) - } - } - test("support for setting dataChange to false") { val tempDir = Utils.createTempDir() From 32af18c615afe0d4bcac27183790ca8cfed94d26 Mon Sep 17 00:00:00 2001 From: Mukul Murthy <38224594+mukulmurthy@users.noreply.github.com> Date: Thu, 7 Nov 2019 00:56:37 +0000 Subject: [PATCH 07/44] [DELTA-OSS-EXTERNAL] Update Spark Summit tutorial description and add video link Now that the videos from Spark Summit have been published, we can link to the video of the tutorial. Also updated the tutorial's description. Closes delta-io/delta#234 Author: Tathagata Das Author: Mukul Murthy <38224594+mukulmurthy@users.noreply.github.com> #6887 is resolved by tdas/lvr4tjzx. GitOrigin-RevId: be593b21236f8b9fb0a81e81e33454b0df79135e --- .../tutorials/saiseu19/img/Video-Preview.png | Bin 0 -> 245891 bytes examples/tutorials/saiseu19/readme.md | 4 ++++ 2 files changed, 4 insertions(+) create mode 100644 examples/tutorials/saiseu19/img/Video-Preview.png diff --git a/examples/tutorials/saiseu19/img/Video-Preview.png b/examples/tutorials/saiseu19/img/Video-Preview.png new file mode 100644 index 0000000000000000000000000000000000000000..c3b4bc4d3f50dce9fdbdb94a2bf6b6174f5ad7f9 GIT binary patch literal 245891 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

tUCVfVof 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

t^@2tqDd@Z7xUU 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

9|7ef)C;Uq!ByZog-GL{! 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 z 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 B@{<4n literal 0 HcmV?d00001 diff --git a/examples/tutorials/saiseu19/readme.md b/examples/tutorials/saiseu19/readme.md index 4fe729ba015..2409a4c31ee 100644 --- a/examples/tutorials/saiseu19/readme.md +++ b/examples/tutorials/saiseu19/readme.md @@ -2,6 +2,10 @@ ### Sign Up for Databricks Community Edition +This tutorial goes through many features of Delta Lake features including schema enforcement and schema evolution, interoperability between batch and streaming workloads, time travel, and DML commands like Delete and Merge. It was originally given at [Spark Summit 2019 Europe](https://databricks.com/sparkaisummit/europe) and is available in both Scala and Python. The instructions on this page explain how to run the examples on Databricks Community Edition, but all the pieces (except some of the Databricks filesystem bits) should work in any **Spark 2.4.2** or higher with **Delta Lake 0.4.0** or higher. If you'd prefer to watch the tutorial, along with some brief background information about the problems Delta Lake tries to solve, in video form, here's the recording from one of the Spark Summit sessions: + +[![ ](img/Video-Preview.png)](https://youtu.be/cpA3Ni8ZUPI) +

Expand to view more details about Databricks Community Edition From 261e1ad8e674dfac556d500000f07f3ddb99d2b3 Mon Sep 17 00:00:00 2001 From: Nicolas Paris Date: Thu, 7 Nov 2019 21:18:48 +0000 Subject: [PATCH 08/44] [DELTA-OSS-EXTERNAL] Merge insertAll and updateAll fail in case of dotted columns This resolves #233 and #208. This PR add a test to track the issue and also proposes a fix by quoting with backticks the columns coming from the target plan. Closes delta-io/delta#235 Author: Tathagata Das Author: Tathagata Das Author: Nicolas Paris GitOrigin-RevId: e893389e671cbee2cce21eeda33afd3b6fa93c84 --- .../sql/catalyst/plans/logical/merge.scala | 5 ++-- .../spark/sql/delta/MergeIntoScalaSuite.scala | 23 +++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/merge.scala b/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/merge.scala index 4d12da8df1a..7b4a385a56c 100644 --- a/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/merge.scala +++ b/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/merge.scala @@ -265,8 +265,9 @@ object MergeInto { // expression (i.e. sourceColumnBySameName) needs to be resolved only by the source // plan. fakeTargetPlan.output.map(_.name).map { tgtColName => - val resolvedExpr = - resolveOrFail(UnresolvedAttribute(tgtColName), fakeSourcePlan, s"$typ clause") + val resolvedExpr = resolveOrFail( + UnresolvedAttribute.quotedString(s"`$tgtColName`"), + fakeSourcePlan, s"$typ clause") MergeAction(Seq(tgtColName), resolvedExpr) } diff --git a/src/test/scala/org/apache/spark/sql/delta/MergeIntoScalaSuite.scala b/src/test/scala/org/apache/spark/sql/delta/MergeIntoScalaSuite.scala index c1687d642b0..25b9cd18388 100644 --- a/src/test/scala/org/apache/spark/sql/delta/MergeIntoScalaSuite.scala +++ b/src/test/scala/org/apache/spark/sql/delta/MergeIntoScalaSuite.scala @@ -117,6 +117,29 @@ class MergeIntoScalaSuite extends MergeIntoSuiteBase { } } + test("updateAll and insertAll with columns containing dot") { + withTable("source") { + append(Seq((1, 10), (2, 20), (4, 40)).toDF("key", "the.value"), Nil) // target + val source = Seq((1, 100), (3, 30), (4, 41)).toDF("key", "the.value") // source + + io.delta.tables.DeltaTable.forPath(spark, tempPath).as("t") + .merge(source.as("s"), "t.key = s.key") + .whenMatched() + .updateAll() + .whenNotMatched() + .insertAll() + .execute() + + checkAnswer( + readDeltaTable(tempPath), + Row(1, 100) :: // Update + Row(2, 20) :: // No change + Row(4, 41) :: // Update + Row(3, 30) :: // Insert + Nil) + } + } + test("update with empty map should do nothing") { append(Seq((1, 10), (2, 20)).toDF("trgKey", "trgValue"), Nil) // target val source = Seq((1, 100), (3, 30)).toDF("srcKey", "srcValue") // source From 658b8493ad947cfe1b920d23c9fd0915170b7835 Mon Sep 17 00:00:00 2001 From: Burak Yavuz Date: Mon, 11 Nov 2019 21:14:44 +0000 Subject: [PATCH 09/44] [SC-25430][DELTA][FIXIT] Avoid unnecessary filesystem checks in Delta Snapshot creation We do a lot of unnecessary file listing when creating/updating a Delta Snapshot. We have checks around: 1. Is there a _delta_log directory under each parent directory (recursive) 2. File listing to infer file format partitioning (for both JSON and parquet) 3. File existence checks for each file These all add latency to the state update of a Delta table, and especially (2) has a linear cost as the table grows larger, which is unacceptable. This PR introduces a DeltaLogFileIndex to use as part of a `LogicalRelation` and `HadoopFSRelation` to skip (1) and (3) and avoid (2), which are all done by DataSource. Existing tests + Improved numbers under DeltaFileOperationsSuite, and on average 1 second saved on the loading of `prod_ds.usage_logs`. Author: Burak Yavuz Author: Burak Yavuz GitOrigin-RevId: 2e25a5b4d4fd821af00dd28942544ba539751d2a --- .../apache/spark/sql/delta/DeltaErrors.scala | 2 +- .../org/apache/spark/sql/delta/DeltaLog.scala | 49 +++++++++++++--- .../spark/sql/delta/DeltaLogFileIndex.scala | 58 +++++++++++++++++++ .../org/apache/spark/sql/delta/Snapshot.scala | 35 +++++++---- 4 files changed, 123 insertions(+), 21 deletions(-) create mode 100644 src/main/scala/org/apache/spark/sql/delta/DeltaLogFileIndex.scala diff --git a/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala b/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala index 8750627ddea..6357451d92c 100644 --- a/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala +++ b/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala @@ -310,7 +310,7 @@ object DeltaErrors s"(${DeltaConfigs.IS_APPEND_ONLY.key}=false)'.") } - def missingPartFilesException(c: CheckpointMetaData, ae: AnalysisException): Throwable = { + def missingPartFilesException(c: CheckpointMetaData, ae: Exception): Throwable = { new IllegalStateException( s"Couldn't find all part files of the checkpoint version: ${c.version}", ae) } diff --git a/src/main/scala/org/apache/spark/sql/delta/DeltaLog.scala b/src/main/scala/org/apache/spark/sql/delta/DeltaLog.scala index 6e34f0a97d1..8f47f07e2e9 100644 --- a/src/main/scala/org/apache/spark/sql/delta/DeltaLog.scala +++ b/src/main/scala/org/apache/spark/sql/delta/DeltaLog.scala @@ -42,6 +42,8 @@ import org.apache.spark.sql.catalyst.analysis.{Resolver, UnresolvedAttribute} import org.apache.spark.sql.catalyst.expressions.{And, Attribute, Expression, In, InSet, Literal} import org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper import org.apache.spark.sql.execution.datasources._ +import org.apache.spark.sql.execution.datasources.json.JsonFileFormat +import org.apache.spark.sql.execution.datasources.parquet.ParquetFileFormat import org.apache.spark.sql.sources.{BaseRelation, InsertableRelation} import org.apache.spark.util.{Clock, SystemClock, ThreadUtils} @@ -144,14 +146,15 @@ class DeltaLog private( val deltaVersions = deltas.map(f => deltaVersion(f.getPath)) verifyDeltaVersions(deltaVersions) val newVersion = deltaVersions.lastOption.getOrElse(c.version) - val deltaFiles = ((c.version + 1) to newVersion).map(deltaFile(logPath, _)) logInfo(s"Loading version $newVersion starting from checkpoint ${c.version}") try { + val deltaIndex = DeltaLogFileIndex(DeltaLog.COMMIT_FILE_FORMAT, deltas) + val checkpointIndex = DeltaLogFileIndex(DeltaLog.CHECKPOINT_FILE_FORMAT, fs, checkpointFiles) val snapshot = new Snapshot( logPath, newVersion, None, - checkpointFiles ++ deltaFiles, + checkpointIndex :: deltaIndex :: Nil, minFileRetentionTimestamp, this, // we don't want to make an additional RPC here to get commit timestamps when "deltas" is @@ -162,6 +165,10 @@ class DeltaLog private( lastUpdateTimestamp = clock.getTimeMillis() snapshot } catch { + case e: FileNotFoundException + if Option(e.getMessage).exists(_.contains("parquet does not exist")) => + recordDeltaEvent(this, "delta.checkpoint.error.partial") + throw DeltaErrors.missingPartFilesException(c, e) case e: AnalysisException if Option(e.getMessage).exists(_.contains("Path does not exist")) => recordDeltaEvent(this, "delta.checkpoint.error.partial") throw DeltaErrors.missingPartFilesException(c, e) @@ -300,8 +307,10 @@ class DeltaLog private( val newCheckpointFiles = newCheckpoint.get.getCorrespondingFiles(logPath) val newVersion = deltaVersions.last - val deltaFiles = - ((newCheckpointVersion + 1) to newVersion).map(deltaFile(logPath, _)) + + val deltaIndex = DeltaLogFileIndex(DeltaLog.COMMIT_FILE_FORMAT, deltas) + val checkpointIndex = + DeltaLogFileIndex(DeltaLog.CHECKPOINT_FILE_FORMAT, fs, newCheckpointFiles) logInfo(s"Loading version $newVersion starting from checkpoint $newCheckpointVersion") @@ -309,7 +318,7 @@ class DeltaLog private( logPath, newVersion, None, - newCheckpointFiles ++ deltaFiles, + checkpointIndex :: deltaIndex :: Nil, minFileRetentionTimestamp, this, deltas.last.getModificationTime) @@ -321,11 +330,12 @@ class DeltaLog private( // Load Snapshot from scratch to avoid StackOverflowError getSnapshotAt(deltaVersions.last, Some(deltas.last.getModificationTime)) } else { + val deltaIndex = DeltaLogFileIndex(DeltaLog.COMMIT_FILE_FORMAT, deltas) new Snapshot( logPath, deltaVersions.last, Some(currentSnapshot.state), - deltas.map(_.getPath), + deltaIndex :: Nil, minFileRetentionTimestamp, this, deltas.last.getModificationTime, @@ -526,13 +536,31 @@ class DeltaLog private( throw DeltaErrors.logFileNotFoundException(versionZeroFile, 0L, metadata) } } - val deltaData = - ((checkpointVersion.getOrElse(-1L) + 1) to version).map(deltaFile(logPath, _)) + val startVersion = checkpointVersion.getOrElse(-1L) + 1 + // Listing the files may be more efficient than getting the file status for each file + val deltaData = store.listFrom(deltaFile(logPath, startVersion)) + .filter(f => isDeltaFile(f.getPath)) + .takeWhile(f => deltaVersion(f.getPath) <= version) + .toArray + val deltaFileVersions = deltaData.map(f => deltaVersion(f.getPath)) + if (deltaFileVersions.nonEmpty) { + // deltaFileVersions can be empty if we're loading a version for which a checkpoint exists + verifyDeltaVersions(deltaFileVersions) + require(deltaFileVersions.head == startVersion, + s"Did not get the first delta file version: $startVersion to compute Snapshot") + require(deltaFileVersions.last == version, + s"Did not get the last delta file version: $version to compute Snapshot") + } + + val deltaIndex = DeltaLogFileIndex(DeltaLog.COMMIT_FILE_FORMAT, deltaData) + val checkpointIndex = + DeltaLogFileIndex(DeltaLog.CHECKPOINT_FILE_FORMAT, fs, lastCheckpointFiles) + new Snapshot( logPath, version, None, - lastCheckpointFiles ++ deltaData, + checkpointIndex :: deltaIndex :: Nil, minFileRetentionTimestamp, this, commitTimestamp.getOrElse(-1L)) @@ -797,4 +825,7 @@ object DeltaLog extends DeltaLogging { case InSet(a, set) => In(a, set.toSeq.map(Literal(_))) }) } + + private lazy val COMMIT_FILE_FORMAT = new JsonFileFormat + private lazy val CHECKPOINT_FILE_FORMAT = new ParquetFileFormat } diff --git a/src/main/scala/org/apache/spark/sql/delta/DeltaLogFileIndex.scala b/src/main/scala/org/apache/spark/sql/delta/DeltaLogFileIndex.scala new file mode 100644 index 00000000000..843f8e8a0a1 --- /dev/null +++ b/src/main/scala/org/apache/spark/sql/delta/DeltaLogFileIndex.scala @@ -0,0 +1,58 @@ +/* + * Copyright 2019 Databricks, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.spark.sql.delta + +import org.apache.hadoop.fs._ + +import org.apache.spark.sql.catalyst.InternalRow +import org.apache.spark.sql.catalyst.expressions._ +import org.apache.spark.sql.execution.datasources.{FileFormat, FileIndex, PartitionDirectory} +import org.apache.spark.sql.types.StructType + +/** + * A specialized file index for files found in the _delta_log directory. By using this file index, + * we avoid any additional file listing, partitioning inference, and file existence checks when + * computing the state of a Delta table. + * + * @param format The file format of the log files. Currently "parquet" or "json" + * @param files The files to read + */ +case class DeltaLogFileIndex(format: FileFormat, files: Array[FileStatus]) extends FileIndex { + + override lazy val rootPaths: Seq[Path] = files.map(_.getPath) + + override def listFiles( + partitionFilters: Seq[Expression], + dataFilters: Seq[Expression]): Seq[PartitionDirectory] = { + PartitionDirectory(InternalRow(), files) :: Nil + } + + override val inputFiles: Array[String] = files.map(_.getPath).map(_.toString) + + override def refresh(): Unit = {} + + override val sizeInBytes: Long = files.map(_.getLen).sum + + override def partitionSchema: StructType = new StructType() +} + +object DeltaLogFileIndex { + + def apply(format: FileFormat, fs: FileSystem, paths: Seq[Path]): DeltaLogFileIndex = { + DeltaLogFileIndex(format, paths.map(fs.getFileStatus).toArray) + } +} diff --git a/src/main/scala/org/apache/spark/sql/delta/Snapshot.scala b/src/main/scala/org/apache/spark/sql/delta/Snapshot.scala index 1eff4c63e95..2cea6fddb9c 100644 --- a/src/main/scala/org/apache/spark/sql/delta/Snapshot.scala +++ b/src/main/scala/org/apache/spark/sql/delta/Snapshot.scala @@ -29,6 +29,8 @@ import org.apache.hadoop.fs.{FileSystem, Path} import org.apache.spark.sql._ import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder +import org.apache.spark.sql.catalyst.plans.logical.Union +import org.apache.spark.sql.execution.datasources.{HadoopFsRelation, LogicalRelation} import org.apache.spark.sql.expressions.UserDefinedFunction import org.apache.spark.sql.functions._ import org.apache.spark.sql.types.StructType @@ -53,7 +55,7 @@ class Snapshot( val path: Path, val version: Long, previousSnapshot: Option[Dataset[SingleAction]], - files: Seq[Path], + files: Seq[DeltaLogFileIndex], val minFileRetentionTimestamp: Long, val deltaLog: DeltaLog, val timestamp: Long, @@ -168,17 +170,28 @@ class Snapshot( val numIndexedCols: Int = DeltaConfigs.DATA_SKIPPING_NUM_INDEXED_COLS.fromMetaData(metadata) /** - * Load the transaction logs from paths. The files here may have different file formats and the - * file format can be extracted from the file extensions. - * - * Here we are reading the transaction log, and we need to bypass the ACL checks - * for SELECT any file permissions. + * Load the transaction logs from file indices. The files here may have different file formats + * and the file format can be extracted from the file extensions. */ - private def load(paths: Seq[Path]): Dataset[SingleAction] = { - val pathAndFormats = paths.map(_.toString).map(path => path -> path.split("\\.").last) - pathAndFormats.groupBy(_._2).map { case (format, paths) => - spark.read.format(format).schema(logSchema).load(paths.map(_._1): _*).as[SingleAction] - }.reduceOption(_.union(_)).getOrElse(emptyActions) + private def load( + files: Seq[DeltaLogFileIndex]): Dataset[SingleAction] = { + val relations = files.map { index: DeltaLogFileIndex => + val fsRelation = HadoopFsRelation( + index, + index.partitionSchema, + logSchema, + None, + index.format, + Map.empty[String, String])(spark) + LogicalRelation(fsRelation) + } + if (relations.length == 1) { + Dataset[SingleAction](spark, relations.head) + } else if (relations.nonEmpty) { + Dataset[SingleAction](spark, Union(relations)) + } else { + emptyActions + } } private def emptyActions = From 23c7613aa2e2af94967b7dce4b0423a857ab66f2 Mon Sep 17 00:00:00 2001 From: Rahul Mahadev Date: Tue, 12 Nov 2019 20:53:20 +0000 Subject: [PATCH 10/44] [SC-25233][DELTA] Optimized Insert only merge for OSS Using the merge statement with purely a WHEN NOT MATCHED THEN INSERT * is becoming more and more common. This PR optimizes this use case by performing an anti-join on the source data to insert the data instead of performing a full-outer join. Added unit tests in the `MergeIntoSuiteBase` closes delta-io/delta#247 Author: Rahul Mahadev GitOrigin-RevId: d0ae1264f1189617c897fbb63eec15be6d5a00f9 --- .../sql/delta/commands/MergeIntoCommand.scala | 66 +++++++++++++++++-- .../spark/sql/delta/MergeIntoSuiteBase.scala | 64 ++++++++++++++---- 2 files changed, 110 insertions(+), 20 deletions(-) diff --git a/src/main/scala/org/apache/spark/sql/delta/commands/MergeIntoCommand.scala b/src/main/scala/org/apache/spark/sql/delta/commands/MergeIntoCommand.scala index 4f964a475d6..e6106741761 100644 --- a/src/main/scala/org/apache/spark/sql/delta/commands/MergeIntoCommand.scala +++ b/src/main/scala/org/apache/spark/sql/delta/commands/MergeIntoCommand.scala @@ -100,6 +100,9 @@ case class MergeIntoCommand( @transient private lazy val sc: SparkContext = SparkContext.getOrCreate() @transient private lazy val targetDeltaLog: DeltaLog = targetFileIndex.deltaLog + /** Whether this merge statement only inserts new data. */ + private def isInsertOnly: Boolean = matchedClauses.isEmpty && notMatchedClause.isDefined + lazy val updateClause: Option[MergeIntoUpdateClause] = matchedClauses.collectFirst { case u: MergeIntoUpdateClause => u } lazy val deleteClause: Option[MergeIntoDeleteClause] = @@ -120,13 +123,16 @@ case class MergeIntoCommand( spark: SparkSession): Seq[Row] = recordDeltaOperation(targetDeltaLog, "delta.dml.merge") { targetDeltaLog.withNewTransaction { deltaTxn => val deltaActions = { - val filesToRewrite = - recordDeltaOperation(targetDeltaLog, "delta.dml.merge.findTouchedFiles") { - findTouchedFiles(spark, deltaTxn) - } - - val newWrittenFiles = writeAllChanges(spark, deltaTxn, filesToRewrite) - filesToRewrite.map(_.remove) ++ newWrittenFiles + if (isInsertOnly) { + writeInsertsOnlyWhenNoMatchedClauses(spark, deltaTxn) + } else { + val filesToRewrite = + recordDeltaOperation(targetDeltaLog, "delta.dml.merge.findTouchedFiles") { + findTouchedFiles(spark, deltaTxn) + } + val newWrittenFiles = writeAllChanges(spark, deltaTxn, filesToRewrite) + filesToRewrite.map(_.remove) ++ newWrittenFiles + } } deltaTxn.commit( deltaActions, @@ -232,6 +238,52 @@ case class MergeIntoCommand( touchedAddFiles } + /** + * This is an optimization of the case when there is no update clause for the merge. + * We perform an left anti join on the source data to find the rows to be inserted. + */ + private def writeInsertsOnlyWhenNoMatchedClauses( + spark: SparkSession, + deltaTxn: OptimisticTransaction + ): Seq[AddFile] = withStatusCode("DELTA", s"Writing new files " + + s"for insert-only MERGE operation") { + + // UDFs to update metrics + val incrSourceRowCountExpr = makeMetricUpdateUDF("numSourceRows") + val incrInsertedCountExpr = makeMetricUpdateUDF("numTargetRowsInserted") + + val outputColNames = target.output.map(_.name) + val outputExprs = notMatchedClause.get.resolvedActions.map(_.expr) :+ incrInsertedCountExpr + val outputCols = outputExprs.zip(outputColNames).map { case (expr, name) => + new Column(Alias(expr, name)()) + } + + // source DataFrame + val sourceDF = Dataset.ofRows(spark, source) + .filter(new Column(incrSourceRowCountExpr)) + .filter(new Column(notMatchedClause.get.condition.getOrElse(Literal(true)))) + + // Skip data based on the merge condition + val conjunctivePredicates = splitConjunctivePredicates(condition) + val targetOnlyPredicates = + conjunctivePredicates.filter(_.references.subsetOf(target.outputSet)) + val dataSkippedFiles = deltaTxn.filterFiles(targetOnlyPredicates) + + // target DataFrame + val targetDF = Dataset.ofRows( + spark, buildTargetPlanWithFiles(deltaTxn, dataSkippedFiles)) + + val insertDf = sourceDF.join(targetDF, new Column(condition), "leftanti") + .select(outputCols: _*) + + val newFiles = deltaTxn.writeFiles(insertDf) + metrics("numTargetFilesBeforeSkipping") += deltaTxn.snapshot.numOfFiles + metrics("numTargetFilesAfterSkipping") += dataSkippedFiles.size + metrics("numTargetFilesRemoved") += 0 + metrics("numTargetFilesAdded") += newFiles.size + newFiles + } + /** * Write new files by reading the touched files and updating/inserting data using the source * query/table. This is implemented using a full-outer-join using the merge condition. diff --git a/src/test/scala/org/apache/spark/sql/delta/MergeIntoSuiteBase.scala b/src/test/scala/org/apache/spark/sql/delta/MergeIntoSuiteBase.scala index f08f42afb66..2dfe92d4659 100644 --- a/src/test/scala/org/apache/spark/sql/delta/MergeIntoSuiteBase.scala +++ b/src/test/scala/org/apache/spark/sql/delta/MergeIntoSuiteBase.scala @@ -1185,7 +1185,7 @@ abstract class MergeIntoSuiteBase errorStrs = Nil) // subqueries fail for unresolved reference to `t` - private def testExtendedMerge( + protected def testExtendedMerge( name: String)( source: Seq[(Int, Int)], target: Seq[(Int, Int)], @@ -1320,18 +1320,6 @@ abstract class MergeIntoSuiteBase (3, 30) // (3, 30) inserted )) - test(s"extended syntax - only insert with multiple matches") { - withKeyValueData( - source = (0, 0) :: (1, 10) :: (1, 100) :: (3, 30) :: (3, 300) :: Nil, - target = (1, 1) :: (2, 2) :: Nil - ) { case (sourceName, targetName) => - intercept[UnsupportedOperationException] { - executeMerge(s"$targetName t", s"$sourceName s", "s.key = t.key", - insert(values = "(key, value) VALUES (s.key, s.value)")) - } - } - } - testExtendedMerge("only conditional insert")( source = (0, 0) :: (1, 10) :: (3, 30) :: Nil, target = (1, 1) :: (2, 2) :: Nil, @@ -1560,4 +1548,54 @@ abstract class MergeIntoSuiteBase update(set = "value = someValue"), insert(values = "*"))( errorStrs = "INSERT clause" :: "value" :: Nil) + + testExtendedMerge("insert only merge")( + source = (0, 0) :: (1, 10) :: (3, 30) :: Nil, + target = (1, 1) :: (2, 2) :: Nil, + mergeOn = "s.key = t.key", + insert(values = "*"))( + result = Seq( + (0, 0), // inserted + (1, 1), // existed previously + (2, 2), // existed previously + (3, 30) // inserted + )) + + testExtendedMerge("insert only merge with insert condition on source")( + source = (0, 0) :: (1, 10) :: (3, 30) :: Nil, + target = (1, 1) :: (2, 2) :: Nil, + mergeOn = "s.key = t.key", + insert(values = "*", condition = "s.key = s.value"))( + result = Seq( + (0, 0), // inserted + (1, 1), // existed previously + (2, 2) // existed previously + )) + + testExtendedMerge("insert only merge with predicate insert")( + source = (0, 0) :: (1, 10) :: (3, 30) :: Nil, + target = (1, 1) :: (2, 2) :: Nil, + mergeOn = "s.key = t.key", + insert(values = "(t.key, t.value) VALUES (s.key + 10, s.value + 10)"))( + result = Seq( + (10, 10), // inserted + (1, 1), // existed previously + (2, 2), // existed previously + (13, 40) // inserted + )) + + testExtendedMerge(s"insert only merge with multiple matches") ( + source = (0, 0) :: (1, 10) :: (1, 100) :: (3, 30) :: (3, 300) :: Nil, + target = (1, 1) :: (2, 2) :: Nil, + mergeOn = "s.key = t.key", + insert(values = "(key, value) VALUES (s.key, s.value)")) ( + result = Seq( + (0, 0), // inserted + (1, 1), // existed previously + (2, 2), // existed previously + (3, 30), // inserted + (3, 300) // key exists but still inserted + ) + ) + } From 0b9966bc1bfc872a43f1788cc0c03266bb6a2fc2 Mon Sep 17 00:00:00 2001 From: Rahul Mahadev Date: Wed, 13 Nov 2019 06:20:35 +0000 Subject: [PATCH 11/44] [SC-25227][DELTA] Added checks for metadata changing operations with dataChange ## What changes were proposed in this pull request? Added checks to catch operations that change metadata while having `dataChange` set to false. ## How was this patch tested? Added 'DeltaOptionSuite` Author: Rahul Mahadev #6846 is resolved by rahulsmahadev/dataChangeFlags. GitOrigin-RevId: 15442af0d5a5d640aa2ee19ca2c903fdec8aa5d0 --- .../apache/spark/sql/delta/DeltaErrors.scala | 5 + .../sql/delta/commands/WriteIntoDelta.scala | 4 +- .../schema/ImplicitMetadataOperation.scala | 13 +- .../spark/sql/delta/DeltaOptionSuite.scala | 133 ++++++++++++++++++ .../apache/spark/sql/delta/DeltaSuite.scala | 53 +------ 5 files changed, 153 insertions(+), 55 deletions(-) create mode 100644 src/test/scala/org/apache/spark/sql/delta/DeltaOptionSuite.scala diff --git a/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala b/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala index 6357451d92c..cbc6c61d63b 100644 --- a/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala +++ b/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala @@ -185,6 +185,11 @@ object DeltaErrors "Vacuuming specific partitions is currently not supported.") } + def unexpectedDataChangeException(op: String): Throwable = { + new AnalysisException(s"Attempting to change metadata when 'dataChange' option is set" + + s" to false during $op") + } + def unknownConfigurationKeyException(confKey: String): Throwable = { new AnalysisException(s"Unknown configuration was specified: $confKey") } diff --git a/src/main/scala/org/apache/spark/sql/delta/commands/WriteIntoDelta.scala b/src/main/scala/org/apache/spark/sql/delta/commands/WriteIntoDelta.scala index 635d3bd69d7..6fac31ff08a 100644 --- a/src/main/scala/org/apache/spark/sql/delta/commands/WriteIntoDelta.scala +++ b/src/main/scala/org/apache/spark/sql/delta/commands/WriteIntoDelta.scala @@ -81,7 +81,8 @@ case class WriteIntoDelta( deltaLog.assertRemovable() } } - updateMetadata(txn, data, partitionColumns, configuration, isOverwriteOperation) + val rearrangeOnly = options.rearrangeOnly + updateMetadata(txn, data, partitionColumns, configuration, isOverwriteOperation, rearrangeOnly) // Validate partition predicates val replaceWhere = options.replaceWhere @@ -122,7 +123,6 @@ case class WriteIntoDelta( case _ => Nil } - val rearrangeOnly = options.rearrangeOnly if (rearrangeOnly) { newFiles.map(_.copy(dataChange = !rearrangeOnly)) ++ deletedFiles.map(_.copy(dataChange = !rearrangeOnly)) diff --git a/src/main/scala/org/apache/spark/sql/delta/schema/ImplicitMetadataOperation.scala b/src/main/scala/org/apache/spark/sql/delta/schema/ImplicitMetadataOperation.scala index 4f588feff91..e2e20342d35 100644 --- a/src/main/scala/org/apache/spark/sql/delta/schema/ImplicitMetadataOperation.scala +++ b/src/main/scala/org/apache/spark/sql/delta/schema/ImplicitMetadataOperation.scala @@ -52,7 +52,8 @@ trait ImplicitMetadataOperation extends DeltaLogging { data: Dataset[_], partitionColumns: Seq[String], configuration: Map[String, String], - isOverwriteMode: Boolean): Unit = { + isOverwriteMode: Boolean, + rearrangeOnly: Boolean = false): Unit = { val dataSchema = data.schema.asNullable val mergedSchema = if (isOverwriteMode && canOverwriteSchema) { dataSchema @@ -79,6 +80,9 @@ trait ImplicitMetadataOperation extends DeltaLogging { } recordDeltaEvent(txn.deltaLog, "delta.ddl.initializeSchema") // If this is the first write, configure the metadata of the table. + if (rearrangeOnly) { + throw DeltaErrors.unexpectedDataChangeException("Create a Delta table") + } txn.updateMetadata( Metadata( schemaString = dataSchema.json, @@ -91,10 +95,17 @@ trait ImplicitMetadataOperation extends DeltaLogging { partitionColumns = normalizedPartitionCols ) recordDeltaEvent(txn.deltaLog, "delta.ddl.overwriteSchema") + if (rearrangeOnly) { + throw DeltaErrors.unexpectedDataChangeException("Overwrite the Delta table schema or " + + "change the partition schema") + } txn.updateMetadata(newMetadata) } else if (isNewSchema && canMergeSchema && !isNewPartitioning) { logInfo(s"New merged schema: ${mergedSchema.treeString}") recordDeltaEvent(txn.deltaLog, "delta.ddl.mergeSchema") + if (rearrangeOnly) { + throw DeltaErrors.unexpectedDataChangeException("Change the Delta table schema") + } txn.updateMetadata(txn.metadata.copy(schemaString = mergedSchema.json)) } else if (isNewSchema || isNewPartitioning) { recordDeltaEvent(txn.deltaLog, "delta.schemaValidation.failure") diff --git a/src/test/scala/org/apache/spark/sql/delta/DeltaOptionSuite.scala b/src/test/scala/org/apache/spark/sql/delta/DeltaOptionSuite.scala new file mode 100644 index 00000000000..5fee0c4c742 --- /dev/null +++ b/src/test/scala/org/apache/spark/sql/delta/DeltaOptionSuite.scala @@ -0,0 +1,133 @@ +/* + * Copyright 2019 Databricks, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.spark.sql.delta + +import org.apache.spark.sql.delta.actions.{Action, FileAction} +import org.apache.spark.sql.delta.util.FileNames + +import org.apache.spark.SparkConf +import org.apache.spark.sql.{AnalysisException, QueryTest} +import org.apache.spark.sql.test.SharedSparkSession +import org.apache.spark.util.Utils + +class DeltaOptionSuite extends QueryTest + with SharedSparkSession { + + import testImplicits._ + + + + test("support for setting dataChange to false") { + val tempDir = Utils.createTempDir() + + spark.range(100) + .write + .format("delta") + .save(tempDir.toString) + + val df = spark.read.format("delta").load(tempDir.toString) + + df + .write + .format("delta") + .mode("overwrite") + .option("dataChange", "false") + .save(tempDir.toString) + + val deltaLog = DeltaLog.forTable(spark, tempDir) + val version = deltaLog.snapshot.version + val commitActions = deltaLog.store.read(FileNames.deltaFile(deltaLog.logPath, version)) + .map(Action.fromJson) + val fileActions = commitActions.collect { case a: FileAction => a } + + assert(fileActions.forall(!_.dataChange)) + } + + test("dataChange is by default set to true") { + val tempDir = Utils.createTempDir() + + spark.range(100) + .write + .format("delta") + .save(tempDir.toString) + + val df = spark.read.format("delta").load(tempDir.toString) + + df + .write + .format("delta") + .mode("overwrite") + .save(tempDir.toString) + + val deltaLog = DeltaLog.forTable(spark, tempDir) + val version = deltaLog.snapshot.version + val commitActions = deltaLog.store.read(FileNames.deltaFile(deltaLog.logPath, version)) + .map(Action.fromJson) + val fileActions = commitActions.collect { case a: FileAction => a } + + assert(fileActions.forall(_.dataChange)) + } + + test("dataChange is set to false on metadata changing operation") { + withTempDir { tempDir => + // Initialize a table while having dataChange set to false. + val e = intercept[AnalysisException] { + spark.range(100) + .write + .format("delta") + .option("dataChange", "false") + .save(tempDir.getAbsolutePath) + } + assert(e.getMessage === + DeltaErrors.unexpectedDataChangeException("Create a Delta table").getMessage) + spark.range(100) + .write + .format("delta") + .save(tempDir.getAbsolutePath) + + // Adding a new column to the existing table while having dataChange set to false. + val e2 = intercept[AnalysisException] { + val df = spark.read.format("delta").load(tempDir.getAbsolutePath) + df.withColumn("id2", 'id + 1) + .write + .format("delta") + .mode("overwrite") + .option("mergeSchema", "true") + .option("dataChange", "false") + .save(tempDir.getAbsolutePath) + } + assert(e2.getMessage === + DeltaErrors.unexpectedDataChangeException("Change the Delta table schema").getMessage) + + // Overwriting the schema of the existing table while having dataChange as false. + val e3 = intercept[AnalysisException] { + val df = spark.read.format("delta").load(tempDir.getAbsolutePath) + spark.range(50) + .withColumn("id3", 'id + 1) + .write + .format("delta") + .mode("overwrite") + .option("dataChange", "false") + .option("overwriteSchema", "true") + .save(tempDir.getAbsolutePath) + } + assert(e3.getMessage === + DeltaErrors.unexpectedDataChangeException("Overwrite the Delta table schema or " + + "change the partition schema").getMessage) + } + } +} diff --git a/src/test/scala/org/apache/spark/sql/delta/DeltaSuite.scala b/src/test/scala/org/apache/spark/sql/delta/DeltaSuite.scala index 0496a247c17..25f9d2ebd82 100644 --- a/src/test/scala/org/apache/spark/sql/delta/DeltaSuite.scala +++ b/src/test/scala/org/apache/spark/sql/delta/DeltaSuite.scala @@ -24,7 +24,7 @@ import org.apache.spark.sql.delta.sources.DeltaSQLConf import org.apache.spark.sql.delta.util.FileNames import org.apache.hadoop.fs.{FileSystem, Path} -import org.apache.spark.SparkException +import org.apache.spark.{SparkConf, SparkException} import org.apache.spark.sql._ import org.apache.spark.sql.catalyst.expressions.InSet import org.apache.spark.sql.catalyst.plans.logical.Filter @@ -915,55 +915,4 @@ class DeltaSuite extends QueryTest } } } - - test("support for setting dataChange to false") { - val tempDir = Utils.createTempDir() - - spark.range(100) - .write - .format("delta") - .save(tempDir.toString) - - val df = spark.read.format("delta").load(tempDir.toString) - - df - .write - .format("delta") - .mode("overwrite") - .option("dataChange", "false") - .save(tempDir.toString) - - val deltaLog = DeltaLog.forTable(spark, tempDir) - val version = deltaLog.snapshot.version - val commitActions = deltaLog.store.read(FileNames.deltaFile(deltaLog.logPath, version)) - .map(Action.fromJson) - val fileActions = commitActions.collect { case a: FileAction => a } - - assert(fileActions.forall(!_.dataChange)) - } - - test("dataChange is by default set to true") { - val tempDir = Utils.createTempDir() - - spark.range(100) - .write - .format("delta") - .save(tempDir.toString) - - val df = spark.read.format("delta").load(tempDir.toString) - - df - .write - .format("delta") - .mode("overwrite") - .save(tempDir.toString) - - val deltaLog = DeltaLog.forTable(spark, tempDir) - val version = deltaLog.snapshot.version - val commitActions = deltaLog.store.read(FileNames.deltaFile(deltaLog.logPath, version)) - .map(Action.fromJson) - val fileActions = commitActions.collect { case a: FileAction => a } - - assert(fileActions.forall(_.dataChange)) - } } From 48f5185808817a737f401f77c1bff0a298e5343d Mon Sep 17 00:00:00 2001 From: Rahul Mahadev Date: Thu, 14 Nov 2019 21:25:25 +0000 Subject: [PATCH 12/44] [SC-25746][DELTA] Adding feature flag for Optimized Insert only merge Added a feature flag `DELTA_MERGE_INSERT_ONLY_ENABLED` which is enabled by default for Optimized insert only merge. Also did some refactor on tests in this PR Added a test in the `MergeIntoSuiteBase` to toggle the flag off and check if the behavior is like previous implementation. Author: Rahul Mahadev GitOrigin-RevId: fb8bd5d333ae6a8e250b50315143147ed74c72a8 --- .../sql/delta/commands/MergeIntoCommand.scala | 3 +- .../sql/delta/sources/DeltaSQLConf.scala | 11 +++ .../spark/sql/delta/MergeIntoSuiteBase.scala | 91 ++++++++++++++++++- 3 files changed, 103 insertions(+), 2 deletions(-) diff --git a/src/main/scala/org/apache/spark/sql/delta/commands/MergeIntoCommand.scala b/src/main/scala/org/apache/spark/sql/delta/commands/MergeIntoCommand.scala index e6106741761..a33d63ef54c 100644 --- a/src/main/scala/org/apache/spark/sql/delta/commands/MergeIntoCommand.scala +++ b/src/main/scala/org/apache/spark/sql/delta/commands/MergeIntoCommand.scala @@ -21,6 +21,7 @@ import scala.collection.JavaConverters._ import org.apache.spark.sql.delta._ import org.apache.spark.sql.delta.actions.AddFile import org.apache.spark.sql.delta.files._ +import org.apache.spark.sql.delta.sources.DeltaSQLConf import org.apache.spark.sql.delta.util.{AnalysisHelper, SetAccumulator} import org.apache.spark.SparkContext @@ -123,7 +124,7 @@ case class MergeIntoCommand( spark: SparkSession): Seq[Row] = recordDeltaOperation(targetDeltaLog, "delta.dml.merge") { targetDeltaLog.withNewTransaction { deltaTxn => val deltaActions = { - if (isInsertOnly) { + if (isInsertOnly && spark.conf.get(DeltaSQLConf.MERGE_INSERT_ONLY_ENABLED)) { writeInsertsOnlyWhenNoMatchedClauses(spark, deltaTxn) } else { val filesToRewrite = diff --git a/src/main/scala/org/apache/spark/sql/delta/sources/DeltaSQLConf.scala b/src/main/scala/org/apache/spark/sql/delta/sources/DeltaSQLConf.scala index ba5cc9f2f51..a7243f6694a 100644 --- a/src/main/scala/org/apache/spark/sql/delta/sources/DeltaSQLConf.scala +++ b/src/main/scala/org/apache/spark/sql/delta/sources/DeltaSQLConf.scala @@ -206,4 +206,15 @@ object DeltaSQLConf { .longConf .createWithDefault(10000L) + val MERGE_INSERT_ONLY_ENABLED = + buildConf("merge.insertOnly.enabled") + .internal() + .doc( + """ + |If enabled, merge without any matched clause (i.e., insert-only merge) will be optimized + |by avoiding rewriting old files and just inserting new files. + """.stripMargin) + .booleanConf + .createWithDefault(true) + } diff --git a/src/test/scala/org/apache/spark/sql/delta/MergeIntoSuiteBase.scala b/src/test/scala/org/apache/spark/sql/delta/MergeIntoSuiteBase.scala index 2dfe92d4659..a6d71b9b20d 100644 --- a/src/test/scala/org/apache/spark/sql/delta/MergeIntoSuiteBase.scala +++ b/src/test/scala/org/apache/spark/sql/delta/MergeIntoSuiteBase.scala @@ -1195,7 +1195,9 @@ abstract class MergeIntoSuiteBase Seq(true, false).foreach { isPartitioned => test(s"extended syntax - $name - isPartitioned: $isPartitioned ") { withKeyValueData(source, target, isPartitioned) { case (sourceName, targetName) => - executeMerge(s"$targetName t", s"$sourceName s", mergeOn, mergeClauses: _*) + withSQLConf(DeltaSQLConf.MERGE_INSERT_ONLY_ENABLED.key -> "true") { + executeMerge(s"$targetName t", s"$sourceName s", mergeOn, mergeClauses: _*) + } val deltaPath = if (targetName.startsWith("delta.`")) { targetName.stripPrefix("delta.`").stripSuffix("`") } else targetName @@ -1598,4 +1600,91 @@ abstract class MergeIntoSuiteBase ) ) + + protected def testNullCaseInsertOnly(name: String)( + target: Seq[(JInt, JInt)], + source: Seq[(JInt, JInt)], + condition: String, + expectedResults: Seq[(JInt, JInt)], + insertCondition: Option[String] = None) = { + Seq(true, false).foreach { isPartitioned => + test(s"basic case - null handling - $name, isPartitioned: $isPartitioned") { + withView("sourceView") { + val partitions = if (isPartitioned) "key" :: Nil else Nil + append(target.toDF("key", "value"), partitions) + source.toDF("key", "value").createOrReplaceTempView("sourceView") + withSQLConf(DeltaSQLConf.MERGE_INSERT_ONLY_ENABLED.key -> "true") { + if (insertCondition.isDefined) { + executeMerge( + s"delta.`$tempPath` as t", + "sourceView s", + condition, + insert("(t.key, t.value) VALUES (s.key, s.value)", + condition = insertCondition.get)) + } else { + executeMerge( + s"delta.`$tempPath` as t", + "sourceView s", + condition, + insert("(t.key, t.value) VALUES (s.key, s.value)")) + } + } + checkAnswer( + readDeltaTable(tempPath), + expectedResults.map { r => Row(r._1, r._2) } + ) + + Utils.deleteRecursively(new File(tempPath)) + } + } + } + } + + testNullCaseInsertOnly("insert only merge - null in source") ( + target = Seq((1, 1)), + source = Seq((1, 10), (2, 20), (null, null)), + condition = "s.key = t.key", + expectedResults = Seq( + (1, 1), // Existing value + (2, 20), // Insert + (null, null) // Insert + )) + + testNullCaseInsertOnly("insert only merge - null value in both source and target")( + target = Seq((1, 1), (null, null)), + source = Seq((1, 10), (2, 20), (null, 0)), + condition = "s.key = t.key", + expectedResults = Seq( + (null, null), // No change as null in source does not match null in target + (1, 1), // Existing value + (2, 20), // Insert + (null, 0) // Insert + )) + + testNullCaseInsertOnly("insert only merge - null in insert clause")( + target = Seq((1, 1), (2, 20)), + source = Seq((1, 10), (3, 30), (null, 0)), + condition = "s.key = t.key", + expectedResults = Seq( + (1, 1), // Existing value + (2, 20), // Existing value + (null, 0) // Insert + ), + insertCondition = Some("s.key IS NULL") + ) + + test("insert only merge - turn off feature flag") { + withSQLConf(DeltaSQLConf.MERGE_INSERT_ONLY_ENABLED.key -> "false") { + withKeyValueData( + source = (0, 0) :: (1, 10) :: (1, 100) :: (3, 30) :: (3, 300) :: Nil, + target = (1, 1) :: (2, 2) :: Nil + ) { case (sourceName, targetName) => + intercept[UnsupportedOperationException] { + // This is supposed to fail as the duplicated keys in source were not supported. + executeMerge(s"$targetName t", s"$sourceName s", "s.key = t.key", + insert(values = "(key, value) VALUES (s.key, s.value)")) + } + } + } + } } From b18ffba990ad251dcb41b2f6a5684fb855b7c412 Mon Sep 17 00:00:00 2001 From: Tathagata Das Date: Thu, 14 Nov 2019 23:24:53 +0000 Subject: [PATCH 13/44] [DELTA-OSS-EXTERNAL] Added the SymlinkTextInputFormat manifest generation for Presto/Athena support ## What changes were proposed in this pull request? This PR is the first in the sequence of PRs to add manifest file generation (SymlinkInputFormat) to OSS Delta for Presto/Athena read support (issue https://github.com/delta-io/delta/issues/76). Specifically, this PR adds the core functionality for manifest generation and rigorous tests to verify the contents of the manifest. Future PRs will add the public APIs for on-demand generation. - Added post-commit hooks to run tasks after a successful commit. - Added GenerateSymlinkManifest implementation of post-commit hook to generate the manifests. - Each manifest contains the name of data files to read for querying the whole table or partition - Non-partitioned table produces a single manifest file containing all the data files. - Partitioned table produces partitioned manifest files; same partition structured like the table, each partition directory containing one manifest file containing data files of that partition. This allows Presto/Athena partition-pruned queries to read only manifest files of the necessary partitions. - Each attempt to generate manifest will atomically (as much as possible) overwrite the manifest files in the directories (if they exist) and also delete manifest files of partitions that have been deleted from the table. Closes delta-io/delta#250 Co-authored-by: Tathagata Das Co-authored-by: Rahul Mahadev Author: Tathagata Das Author: Rahul Mahadev #6910 is resolved by tdas/SC-25511. GitOrigin-RevId: a3e04f2fcdafb6ac29c3adcfb791a3d0611583dc --- .../apache/spark/sql/delta/DeltaConfig.scala | 7 + .../apache/spark/sql/delta/DeltaErrors.scala | 14 + .../sql/delta/OptimisticTransaction.scala | 50 ++ .../delta/hooks/GenerateSymlinkManifest.scala | 360 ++++++++++++++ .../sql/delta/hooks/PostCommitHook.scala | 41 ++ .../DeltaGenerateSymlinkManifestSuite.scala | 448 ++++++++++++++++++ 6 files changed, 920 insertions(+) create mode 100644 src/main/scala/org/apache/spark/sql/delta/hooks/GenerateSymlinkManifest.scala create mode 100644 src/main/scala/org/apache/spark/sql/delta/hooks/PostCommitHook.scala create mode 100644 src/test/scala/org/apache/spark/sql/delta/DeltaGenerateSymlinkManifestSuite.scala diff --git a/src/main/scala/org/apache/spark/sql/delta/DeltaConfig.scala b/src/main/scala/org/apache/spark/sql/delta/DeltaConfig.scala index 2f1d8c01aa1..b9f1a77251f 100644 --- a/src/main/scala/org/apache/spark/sql/delta/DeltaConfig.scala +++ b/src/main/scala/org/apache/spark/sql/delta/DeltaConfig.scala @@ -355,4 +355,11 @@ object DeltaConfigs extends DeltaLogging { a => a >= -1, "needs to be larger than or equal to -1.") + val SYMLINK_FORMAT_MANIFEST_ENABLED = buildConfig[Boolean]( + s"${hooks.GenerateSymlinkManifest.CONFIG_NAME_ROOT}.enabled", + "false", + _.toBoolean, + _ => true, + "needs to be a boolean.") + } diff --git a/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala b/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala index cbc6c61d63b..b12b0b9f35e 100644 --- a/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala +++ b/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala @@ -21,6 +21,7 @@ import java.io.FileNotFoundException import java.util.ConcurrentModificationException import org.apache.spark.sql.delta.actions.{CommitInfo, Metadata} +import org.apache.spark.sql.delta.hooks.PostCommitHook import org.apache.spark.sql.delta.metering.DeltaLogging import org.apache.spark.sql.delta.schema.{Invariant, InvariantViolationException} import org.apache.spark.sql.delta.util.JsonUtils @@ -673,6 +674,19 @@ object DeltaErrors def describeViewHistory: Throwable = { new AnalysisException("Cannot describe the history of a view.") } + + def postCommitHookFailedException( + failedHook: PostCommitHook, + failedOnCommitVersion: Long, + extraErrorMessage: String, + error: Throwable): Throwable = { + var errorMessage = s"Committing to the Delta table version $failedOnCommitVersion succeeded" + + s" but error while executing post-commit hook ${failedHook.name}" + if (extraErrorMessage != null && extraErrorMessage.nonEmpty) { + errorMessage += s": $extraErrorMessage" + } + new RuntimeException(errorMessage, error) + } } /** The basic class for all Tahoe commit conflict exceptions. */ diff --git a/src/main/scala/org/apache/spark/sql/delta/OptimisticTransaction.scala b/src/main/scala/org/apache/spark/sql/delta/OptimisticTransaction.scala index 58646680806..6340063abbb 100644 --- a/src/main/scala/org/apache/spark/sql/delta/OptimisticTransaction.scala +++ b/src/main/scala/org/apache/spark/sql/delta/OptimisticTransaction.scala @@ -27,6 +27,7 @@ import scala.util.control.NonFatal import com.databricks.spark.util.TagDefinitions.TAG_LOG_STORE_CLASS import org.apache.spark.sql.delta.actions._ import org.apache.spark.sql.delta.files._ +import org.apache.spark.sql.delta.hooks.{GenerateSymlinkManifest, PostCommitHook} import org.apache.spark.sql.delta.metering.DeltaLogging import org.apache.spark.sql.delta.schema.SchemaUtils import org.apache.spark.sql.delta.sources.DeltaSQLConf @@ -172,6 +173,8 @@ trait OptimisticTransactionImpl extends TransactionalWrite { snapshot.metadata } + protected val postCommitHooks = new ArrayBuffer[PostCommitHook]() + /** Returns the metadata at the current point in the log. */ def metadata: Metadata = newMetadata.getOrElse(snapshotMetadata) @@ -261,6 +264,12 @@ trait OptimisticTransactionImpl extends TransactionalWrite { finalActions = commitInfo +: finalActions } + // Register post-commit hooks if any + lazy val hasFileActions = finalActions.collect { case f: FileAction => f }.nonEmpty + if (DeltaConfigs.SYMLINK_FORMAT_MANIFEST_ENABLED.fromMetaData(metadata) && hasFileActions) { + registerPostCommitHook(GenerateSymlinkManifest) + } + val commitVersion = doCommit(snapshot.version + 1, finalActions, 0) logInfo(s"Committed delta #$commitVersion to ${deltaLog.logPath}") postCommit(commitVersion, finalActions) @@ -274,6 +283,9 @@ trait OptimisticTransactionImpl extends TransactionalWrite { deltaLog, "delta.commit.failure", data = Map("exception" -> Utils.exceptionString(e))) throw e } + + runPostCommitHooks(version, actions) + version } @@ -451,4 +463,42 @@ trait OptimisticTransactionImpl extends TransactionalWrite { logInfo(s"No logical conflicts with deltas [$checkVersion, $nextAttempt), retrying.") doCommit(nextAttempt, actions, attemptNumber + 1) } + + /** Register a hook that will be executed once a commit is successful. */ + def registerPostCommitHook(hook: PostCommitHook): Unit = { + if (!postCommitHooks.contains(hook)) { + postCommitHooks.append(hook) + } + } + + /** Executes the registered post commit hooks. */ + protected def runPostCommitHooks( + version: Long, + committedActions: Seq[Action]): Unit = { + assert(committed, "Can't call post commit hooks before committing") + + // Keep track of the active txn because hooks may create more txns and overwrite the active one. + val activeCommit = OptimisticTransaction.getActive() + OptimisticTransaction.clearActive() + + try { + postCommitHooks.foreach { hook => + try { + hook.run(spark, this, committedActions) + } catch { + case NonFatal(e) => + logWarning(s"Error when executing post-commit hook ${hook.name} " + + s"for commit $version", e) + recordDeltaEvent(deltaLog, "delta.commit.hook.failure", data = Map( + "hook" -> hook.name, + "version" -> version, + "exception" -> e.toString + )) + hook.handleError(e, version) + } + } + } finally { + activeCommit.foreach(OptimisticTransaction.setActive) + } + } } diff --git a/src/main/scala/org/apache/spark/sql/delta/hooks/GenerateSymlinkManifest.scala b/src/main/scala/org/apache/spark/sql/delta/hooks/GenerateSymlinkManifest.scala new file mode 100644 index 00000000000..54ff6860fb7 --- /dev/null +++ b/src/main/scala/org/apache/spark/sql/delta/hooks/GenerateSymlinkManifest.scala @@ -0,0 +1,360 @@ +/* + * Copyright 2019 Databricks, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.spark.sql.delta.hooks + +import org.apache.spark.sql.delta._ +import org.apache.spark.sql.delta.actions._ +import org.apache.spark.sql.delta.metering.DeltaLogging +import org.apache.spark.sql.delta.storage.LogStore +import org.apache.spark.sql.delta.util.DeltaFileOperations +import org.apache.hadoop.fs.Path + +import org.apache.spark.SparkEnv +import org.apache.spark.sql._ +import org.apache.spark.sql.catalyst.analysis.UnresolvedAttribute +import org.apache.spark.sql.catalyst.catalog.ExternalCatalogUtils +import org.apache.spark.sql.catalyst.expressions.{Attribute, Cast, Concat, Expression, Literal, ScalaUDF} +import org.apache.spark.sql.execution.datasources.InMemoryFileIndex +import org.apache.spark.sql.functions.col +import org.apache.spark.sql.types.StringType +import org.apache.spark.util.SerializableConfiguration + +/** + * Post commit hook to generate hive-style manifests for Delta table. This is useful for + * compatibility with Presto / Athena. + */ +object GenerateSymlinkManifest extends GenerateSymlinkManifestImpl + + +trait GenerateSymlinkManifestImpl extends PostCommitHook with DeltaLogging with Serializable { + val CONFIG_NAME_ROOT = "compatibility.symlinkFormatManifest" + + val MANIFEST_LOCATION = "_symlink_format_manifest" + + val OP_TYPE_ROOT = "delta.compatibility.symlinkFormatManifest" + val FULL_MANIFEST_OP_TYPE = s"$OP_TYPE_ROOT.full" + val INCREMENTAL_MANIFEST_OP_TYPE = s"$OP_TYPE_ROOT.incremental" + + override val name: String = "Generate Symlink Format Manifest" + + override def run( + spark: SparkSession, + txn: OptimisticTransactionImpl, + committedActions: Seq[Action]): Unit = { + generateIncrementalManifest(spark, txn.deltaLog, txn.snapshot, committedActions) + } + + override def handleError(error: Throwable, version: Long): Unit = { + throw DeltaErrors.postCommitHookFailedException(this, version, name, error) + } + + /** + * Generate manifest files incrementally, that is, only for the table partitions touched by the + * given actions. + */ + protected def generateIncrementalManifest( + spark: SparkSession, + deltaLog: DeltaLog, + txnReadSnapshot: Snapshot, + actions: Seq[Action]): Unit = recordManifestGeneration(deltaLog, full = false) { + + import spark.implicits._ + val currentSnapshot = deltaLog.snapshot + + val partitionCols = currentSnapshot.metadata.partitionColumns + val manifestRootDirPath = new Path(deltaLog.dataPath, MANIFEST_LOCATION) + val hadoopConf = new SerializableConfiguration(spark.sessionState.newHadoopConf()) + val fs = deltaLog.dataPath.getFileSystem(hadoopConf.value) + if (!fs.exists(manifestRootDirPath)) { + generateFullManifest(spark, deltaLog) + return + } + + // Find all the manifest partitions that need to updated or deleted + val (allFilesInUpdatedPartitions, nowEmptyPartitions) = if (partitionCols.nonEmpty) { + // Get the partitions where files were added + val partitionsOfAddedFiles = actions.collect { case a: AddFile => a.partitionValues }.toSet + + // Get the partitions where files were deleted + val removedFileNames = + spark.createDataset(actions.collect { case r: RemoveFile => r.path }).toDF("path") + val partitionValuesOfRemovedFiles = + txnReadSnapshot.allFiles.join(removedFileNames, "path").select("partitionValues").persist() + try { + val partitionsOfRemovedFiles = + partitionValuesOfRemovedFiles.as[Map[String, String]].collect().toSet + + // Get the files present in the updated partitions + val partitionsUpdated: Set[Map[String, String]] = + partitionsOfAddedFiles ++ partitionsOfRemovedFiles + val filesInUpdatedPartitions = currentSnapshot.allFiles.filter { a => + partitionsUpdated.contains(a.partitionValues) + } + + // Find the current partitions + val currentPartitionRelativeDirs = + withRelativePartitionDir(spark, partitionCols, currentSnapshot.allFiles) + .select("relativePartitionDir").distinct() + + // Find the partitions that became empty and delete their manifests + val partitionRelativeDirsOfRemovedFiles = + withRelativePartitionDir(spark, partitionCols, partitionValuesOfRemovedFiles) + .select("relativePartitionDir").distinct() + + val partitionsThatBecameEmpty = + partitionRelativeDirsOfRemovedFiles.join( + currentPartitionRelativeDirs, Seq("relativePartitionDir"), "leftanti") + .as[String].collect() + + (filesInUpdatedPartitions, partitionsThatBecameEmpty) + } finally { + partitionValuesOfRemovedFiles.unpersist() + } + } else { + (currentSnapshot.allFiles, Array.empty[String]) + } + + val manifestFilePartitionsWritten = writeManifestFiles( + deltaLog.dataPath, + manifestRootDirPath.toString, + allFilesInUpdatedPartitions, + partitionCols, + hadoopConf) + + if (nowEmptyPartitions.nonEmpty) { + deleteManifestFiles(manifestRootDirPath.toString, nowEmptyPartitions, hadoopConf) + } + + // Post stats + val stats = SymlinkManifestStats( + filesWritten = manifestFilePartitionsWritten.size, + filesDeleted = nowEmptyPartitions.length, + partitioned = partitionCols.nonEmpty) + recordDeltaEvent(deltaLog, s"$INCREMENTAL_MANIFEST_OP_TYPE.stats", data = stats) + } + + /** + * Generate manifest files for all the partitions in the table. Note, this will ensure that + * that stale and unnecessary files will be vacuumed. + */ + def generateFullManifest( + spark: SparkSession, + deltaLog: DeltaLog): Unit = recordManifestGeneration(deltaLog, full = true) { + + val snapshot = deltaLog.update(stalenessAcceptable = false) + val partitionCols = snapshot.metadata.partitionColumns + val manifestRootDirPath = new Path(deltaLog.dataPath, MANIFEST_LOCATION).toString + val hadoopConf = new SerializableConfiguration(spark.sessionState.newHadoopConf()) + + // Update manifest files of the current partitions + val newManifestPartitionRelativePaths = writeManifestFiles( + deltaLog.dataPath, + manifestRootDirPath, + snapshot.allFiles, + partitionCols, + hadoopConf) + + // Get the existing manifest files as relative partition paths, that is, + // [ "col1=0/col2=0", "col1=1/col2=1", "col1=2/col2=2" ] + val fs = deltaLog.dataPath.getFileSystem(hadoopConf.value) + val existingManifestPartitionRelativePaths = { + val manifestRootDirAbsPath = fs.makeQualified(new Path(manifestRootDirPath)) + if (fs.exists(manifestRootDirAbsPath)) { + val index = new InMemoryFileIndex(spark, Seq(manifestRootDirAbsPath), Map.empty, None) + val prefixToStrip = manifestRootDirAbsPath.toUri.getPath + index.inputFiles.map { p => + // Remove root directory "rootDir" path from the manifest file paths like + // "rootDir/col1=0/col2=0/manifest" to get the relative partition dir "col1=0/col2=0". + // Note: It important to compare only the "path" in the URI and not the user info in it. + // In s3a://access-key:secret-key@host/path, the access-key and secret-key may change + // unknowingly to `\` and `%` encoding between the root dir and file names generated + // by listing. + val relativeManifestFilePath = + new Path(p).toUri.getPath.stripPrefix(prefixToStrip).stripPrefix(Path.SEPARATOR) + new Path(relativeManifestFilePath).getParent.toString // returns "col1=0/col2=0" + }.filterNot(_.trim.isEmpty).toSet + } else Set.empty[String] + } + + // Delete manifest files for partitions that are not in current and so weren't overwritten + val manifestFilePartitionsToDelete = + existingManifestPartitionRelativePaths.diff(newManifestPartitionRelativePaths) + deleteManifestFiles(manifestRootDirPath, manifestFilePartitionsToDelete, hadoopConf) + + // Post stats + val stats = SymlinkManifestStats( + filesWritten = newManifestPartitionRelativePaths.size, + filesDeleted = manifestFilePartitionsToDelete.size, + partitioned = partitionCols.nonEmpty) + recordDeltaEvent(deltaLog, s"$FULL_MANIFEST_OP_TYPE.stats", data = stats) + } + + /** + * Write the manifest files and return the partition relative paths of the manifests written. + * + * @param deltaLogDataPath path of the table data (e.g., tablePath which has _delta_log in it) + * @param manifestRootDirPath root directory of the manifest files (e.g., tablePath/_manifest/) + * @param fileNamesForManifest relative paths or file names of data files for being written into + * the manifest (e.g., partition=1/xyz.parquet) + * @param partitionCols Table partition columns + * @param hadoopConf Hadoop configuration to use + * @return Set of partition relative paths of the written manifest files (e.g., part1=1/part2=2) + */ + private def writeManifestFiles( + deltaLogDataPath: Path, + manifestRootDirPath: String, + fileNamesForManifest: Dataset[AddFile], + partitionCols: Seq[String], + hadoopConf: SerializableConfiguration): Set[String] = { + + val spark = fileNamesForManifest.sparkSession + import spark.implicits._ + + val tableAbsPathForManifest = + LogStore(spark.sparkContext).resolvePathOnPhysicalStorage(deltaLogDataPath).toString + + /** Write the data file relative paths to manifestDirAbsPath/manifest as absolute paths */ + def writeSingleManifestFile( + manifestDirAbsPath: String, + dataFileRelativePaths: Iterator[String]): Unit = { + + val manifestFilePath = new Path(manifestDirAbsPath, "manifest") + val fs = manifestFilePath.getFileSystem(hadoopConf.value) + fs.mkdirs(manifestFilePath.getParent()) + + val manifestContent = dataFileRelativePaths.map { relativePath => + DeltaFileOperations.absolutePath(tableAbsPathForManifest, relativePath).toString + } + val logStore = LogStore(SparkEnv.get.conf, hadoopConf.value) + logStore.write(manifestFilePath, manifestContent, overwrite = true) + } + + val newManifestPartitionRelativePaths = + withRelativePartitionDir(spark, partitionCols, fileNamesForManifest) + .select("relativePartitionDir", "path").as[(String, String)] + .groupByKey(_._1).mapGroups { + (relativePartitionDir: String, relativeDataFilePath: Iterator[(String, String)]) => + val manifestPartitionDirAbsPath = { + if (relativePartitionDir == null || relativePartitionDir.isEmpty) manifestRootDirPath + else new Path(manifestRootDirPath, relativePartitionDir).toString + } + writeSingleManifestFile(manifestPartitionDirAbsPath, relativeDataFilePath.map(_._2)) + relativePartitionDir + }.collect().toSet + + logInfo(s"Generated manifest partitions for $deltaLogDataPath " + + s"[${newManifestPartitionRelativePaths.size}]:\n\t" + + newManifestPartitionRelativePaths.mkString("\n\t")) + + newManifestPartitionRelativePaths + } + + /** + * Delete manifest files in the given paths. + * + * @param manifestRootDirPath root directory of the manifest files (e.g., tablePath/_manifest/) + * @param partitionRelativePathsToDelete partitions to delete manifest files from + * (e.g., part1=1/part2=2/) + * @param hadoopConf Hadoop configuration to use + */ + private def deleteManifestFiles( + manifestRootDirPath: String, + partitionRelativePathsToDelete: Iterable[String], + hadoopConf: SerializableConfiguration): Unit = { + + val fs = new Path(manifestRootDirPath).getFileSystem(hadoopConf.value) + partitionRelativePathsToDelete.foreach { path => + val absPathToDelete = new Path(manifestRootDirPath, path) + fs.delete(absPathToDelete, true) + } + + logInfo(s"Deleted manifest partitions [${partitionRelativePathsToDelete.size}]:\n\t" + + partitionRelativePathsToDelete.mkString("\n\t")) + } + + /** + * Append a column `relativePartitionDir` to the given Dataset which has `partitionValues` as + * one of the columns. `partitionValues` is a map-type column that contains values of the + * given `partitionCols`. + */ + private def withRelativePartitionDir( + spark: SparkSession, + partitionCols: Seq[String], + datasetWithPartitionValues: Dataset[_]) = { + + require(datasetWithPartitionValues.schema.fieldNames.contains("partitionValues")) + val colNamePrefix = "_col_" + var df: Dataset[_] = datasetWithPartitionValues + + // Flatten out nested partition value columns while renaming them, so that the new columns do + // not conflict with existing columns in DF `pathsWithPartitionValues. + val colToRenamedCols = partitionCols.map { column => + val renamedColumn = s"$colNamePrefix$column" + df = df.withColumn(renamedColumn, col(s"partitionValues.`$column`")) + column -> renamedColumn + } + + // Mapping between original column names to use for generating partition path and + // attributes referring to corresponding columns added to DF `pathsWithPartitionValues`. + val colNameToAttribs = + colToRenamedCols.map { case (col, renamed) => col -> UnresolvedAttribute.quoted(renamed) } + + // Build an expression that can generate the path fragment col1=value/col2=value/ from the + // partition columns. Note: The session time zone maybe different from the time zone that was + // used to write the partition structure of the actual data files. This may lead to + // inconsistencies between the partition structure of metadata files and data files. + val relativePartitionDirExpression = generatePartitionPathExpression( + colNameToAttribs, + spark.sessionState.conf.sessionLocalTimeZone) + + df.withColumn("relativePartitionDir", new Column(relativePartitionDirExpression)) + .drop(colToRenamedCols.map(_._2): _*) + } + + /** Expression that given partition columns builds a path string like: col1=val/col2=val/... */ + protected def generatePartitionPathExpression( + partitionColNameToAttrib: Seq[(String, Attribute)], + timeZoneId: String): Expression = Concat( + + + partitionColNameToAttrib.zipWithIndex.flatMap { case ((colName, col), i) => + val partitionName = ScalaUDF( + ExternalCatalogUtils.getPartitionPathString _, + StringType, + Seq(Literal(colName), Cast(col, StringType, Option(timeZoneId))), + Seq(true, true)) + if (i == 0) Seq(partitionName) else Seq(Literal(Path.SEPARATOR), partitionName) + } + ) + + + private def recordManifestGeneration(deltaLog: DeltaLog, full: Boolean)(thunk: => Unit): Unit = { + val (opType, manifestType) = + if (full) FULL_MANIFEST_OP_TYPE -> "full" + else INCREMENTAL_MANIFEST_OP_TYPE -> "incremental" + recordDeltaOperation(deltaLog, opType) { + withStatusCode("DELTA", s"Updating $manifestType Hive manifest for the Delta table") { + thunk + } + } + } + + case class SymlinkManifestStats( + filesWritten: Int, + filesDeleted: Int, + partitioned: Boolean) +} diff --git a/src/main/scala/org/apache/spark/sql/delta/hooks/PostCommitHook.scala b/src/main/scala/org/apache/spark/sql/delta/hooks/PostCommitHook.scala new file mode 100644 index 00000000000..3309e2a9b2d --- /dev/null +++ b/src/main/scala/org/apache/spark/sql/delta/hooks/PostCommitHook.scala @@ -0,0 +1,41 @@ +/* + * Copyright 2019 Databricks, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.spark.sql.delta.hooks + +import org.apache.spark.sql.delta._ +import org.apache.spark.sql.delta.actions.Action + +import org.apache.spark.sql.SparkSession + +/** + * A hook which can be executed after a transaction. These hooks are registered to a + * [[OptimisticTransaction]], and are executed after a *successful* commit takes place. + */ +trait PostCommitHook { + + /** A user friendly name for the hook for error reporting purposes. */ + val name: String + + /** Executes the hook. */ + def run(spark: SparkSession, txn: OptimisticTransactionImpl, committedActions: Seq[Action]): Unit + + /** + * Handle any error caused while running the hook. By default, all errors are ignored as + * default policy should be to not let post-commit hooks to cause failures in the operation. + */ + def handleError(error: Throwable, version: Long): Unit = {} +} diff --git a/src/test/scala/org/apache/spark/sql/delta/DeltaGenerateSymlinkManifestSuite.scala b/src/test/scala/org/apache/spark/sql/delta/DeltaGenerateSymlinkManifestSuite.scala new file mode 100644 index 00000000000..70abf1bb12c --- /dev/null +++ b/src/test/scala/org/apache/spark/sql/delta/DeltaGenerateSymlinkManifestSuite.scala @@ -0,0 +1,448 @@ +/* + * Copyright 2019 Databricks, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.spark.sql.delta + +import java.io.File +import java.net.URI + +import org.apache.spark.sql.delta.hooks.GenerateSymlinkManifest +import org.apache.spark.sql.delta.util.DeltaFileOperations +import org.apache.hadoop.conf.Configuration +import org.apache.hadoop.fs._ +import org.apache.hadoop.util.Progressable + +import org.apache.spark.sql._ +import org.apache.spark.sql.functions._ +import org.apache.spark.sql.test.SharedSparkSession + +class DeltaGenerateSymlinkManifestSuite + extends DeltaGenerateSymlinkManifestSuiteBase + +trait DeltaGenerateSymlinkManifestSuiteBase extends QueryTest + with SharedSparkSession { + + import testImplicits._ + + test ("full manifest: non-partitioned table") { + withTempDir { tablePath => + tablePath.delete() + + def write(parallelism: Int): Unit = { + spark.createDataset(spark.sparkContext.parallelize(1 to 100, parallelism)) + .write.format("delta").mode("overwrite").save(tablePath.toString) + } + + write(7) + assertManifest(tablePath, expectSameFiles = false, expectedNumFiles = 0) + generateSymlinkManifest(tablePath.toString) + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = 7) + + // Reduce files + write(5) + assertManifest(tablePath, expectSameFiles = false, expectedNumFiles = 7) + generateSymlinkManifest(tablePath.toString) + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = 5) + + // Remove all data + spark.emptyDataset[Int].write.format("delta").mode("overwrite").save(tablePath.toString) + assertManifest(tablePath, expectSameFiles = false, expectedNumFiles = 5) + generateSymlinkManifest(tablePath.toString) + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = 1) + assert(spark.read.format("delta").load(tablePath.toString).count() == 0) + } + } + + test("full manifest: partitioned table") { + withTempDir { tablePath => + tablePath.delete() + + def write(parallelism: Int, partitions1: Int, partitions2: Int): Unit = { + spark.createDataset(spark.sparkContext.parallelize(1 to 100, parallelism)).toDF("value") + .withColumn("part1", $"value" % partitions1) + .withColumn("part2", $"value" % partitions2) + .write.format("delta").partitionBy("part1", "part2") + .mode("overwrite").save(tablePath.toString) + } + + write(10, 10, 10) + assertManifest(tablePath, expectSameFiles = false, expectedNumFiles = 0) + generateSymlinkManifest(tablePath.toString) + // 10 files each in ../part1=X/part2=X/ for X = 0 to 9 + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = 100) + + // Reduce # partitions on both dimensions + write(1, 1, 1) + assertManifest(tablePath, expectSameFiles = false, expectedNumFiles = 100) + generateSymlinkManifest(tablePath.toString) + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = 1) + + // Increase # partitions on both dimensions + write(5, 5, 5) + assertManifest(tablePath, expectSameFiles = false, expectedNumFiles = 1) + generateSymlinkManifest(tablePath.toString) + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = 25) + + // Increase # partitions on only one dimension + write(5, 10, 5) + assertManifest(tablePath, expectSameFiles = false, expectedNumFiles = 25) + generateSymlinkManifest(tablePath.toString) + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = 50) + + // Remove all data + spark.emptyDataset[Int].toDF("value") + .withColumn("part1", $"value" % 10) + .withColumn("part2", $"value" % 10) + .write.format("delta").mode("overwrite").save(tablePath.toString) + assertManifest(tablePath, expectSameFiles = false, expectedNumFiles = 50) + generateSymlinkManifest(tablePath.toString) + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = 0) + assert(spark.read.format("delta").load(tablePath.toString).count() == 0) + } + } + + test("incremental manifest: table property controls post commit manifest generation") { + withTempDir { tablePath => + tablePath.delete() + + def writeWithIncrementalManifest(enabled: Boolean, numFiles: Int): Unit = { + withIncrementalManifest(tablePath, enabled) { + spark.createDataset(spark.sparkContext.parallelize(1 to 100, numFiles)) + .write.format("delta").mode("overwrite").save(tablePath.toString) + } + } + + writeWithIncrementalManifest(enabled = false, numFiles = 1) + assertManifest(tablePath, expectSameFiles = false, expectedNumFiles = 0) + + // Enabling it should automatically generate manifest files + writeWithIncrementalManifest(enabled = true, numFiles = 2) + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = 2) + + // Disabling it should stop updating existing manifest files + writeWithIncrementalManifest(enabled = false, numFiles = 3) + assertManifest(tablePath, expectSameFiles = false, expectedNumFiles = 2) + } + } + + test("incremental manifest: unpartitioned table") { + withTempDir { tablePath => + tablePath.delete() + + def write(numFiles: Int): Unit = withIncrementalManifest(tablePath, enabled = true) { + spark.createDataset(spark.sparkContext.parallelize(1 to 100, numFiles)) + .write.format("delta").mode("overwrite").save(tablePath.toString) + } + + write(1) + // first write won't generate automatic manifest as mode enable after first write + assertManifest(tablePath, expectSameFiles = false, expectedNumFiles = 0) + + // Increase files + write(7) + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = 7) + + // Reduce files + write(5) + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = 5) + + // Remove all data + spark.emptyDataset[Int].write.format("delta").mode("overwrite").save(tablePath.toString) + assert(spark.read.format("delta").load(tablePath.toString).count() == 0) + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = 1) + } + } + + test("incremental manifest: partitioned table") { + withTempDir { tablePath => + tablePath.delete() + + def writePartitioned(parallelism: Int, numPartitions1: Int, numPartitions2: Int): Unit = { + withIncrementalManifest(tablePath, enabled = true) { + val input = + if (parallelism == 0) spark.emptyDataset[Int] + else spark.createDataset(spark.sparkContext.parallelize(1 to 100, parallelism)) + input.toDF("value") + .withColumn("part1", $"value" % numPartitions1) + .withColumn("part2", $"value" % numPartitions2) + .write.format("delta").partitionBy("part1", "part2") + .mode("overwrite").save(tablePath.toString) + } + } + + writePartitioned(1, 1, 1) + // Manifests wont be generated in the first write because `withIncrementalManifest` will + // enable manifest generation only after the first write defines the table log. + assertManifest(tablePath, expectSameFiles = false, expectedNumFiles = 0) + + writePartitioned(10, 10, 10) + // 10 files each in ../part1=X/part2=X/ for X = 0 to 9 (so only 10 subdirectories) + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = 100) + + // Update such that 1 file is removed and 1 file is added in another partition + val deltaTable = io.delta.tables.DeltaTable.forPath(spark, tablePath.toString) + deltaTable.updateExpr("value = 1", Map("part1" -> "0", "value" -> "-1")) + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = 100) + + // Delete such that 1 file is removed + deltaTable.delete("value = -1") + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = 99) + + // Reduce # partitions on both dimensions + writePartitioned(1, 1, 1) + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = 1) + + // Increase # partitions on both dimensions + writePartitioned(5, 5, 5) + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = 25) + + // Increase # partitions on only one dimension + writePartitioned(5, 10, 5) + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = 50) + + // Remove all data + writePartitioned(0, 1, 1) + assert(spark.read.format("delta").load(tablePath.toString).count() == 0) + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = 0) + } + } + + test("incremental manifest: generate full manifest if manifest did not exist") { + withTempDir { tablePath => + + def write(numPartitions: Int): Unit = { + spark.range(0, 100, 1, 1).toDF("value").withColumn("part", $"value" % numPartitions) + .write.format("delta").partitionBy("part").mode("append").save(tablePath.toString) + } + + write(10) + assertManifest(tablePath, expectSameFiles = false, expectedNumFiles = 0) + + withIncrementalManifest(tablePath, enabled = true) { + write(1) // update only one partition + } + // Manifests should be generated for all partitions + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = 11) + } + } + + test("incremental manifest: failure to generate manifest throws exception") { + withTempDir { tablePath => + tablePath.delete() + + import SymlinkManifestFailureTestFileSystem._ + + withSQLConf( + s"fs.$SCHEME.impl" -> classOf[SymlinkManifestFailureTestFileSystem].getName, + s"fs.$SCHEME.impl.disable.cache" -> "true", + s"fs.AbstractFileSystem.$SCHEME.impl" -> + classOf[SymlinkManifestFailureTestAbstractFileSystem].getName, + s"fs.AbstractFileSystem.$SCHEME.impl.disable.cache" -> "true") { + def write(numFiles: Int): Unit = withIncrementalManifest(tablePath, enabled = true) { + spark.createDataset(spark.sparkContext.parallelize(1 to 100, numFiles)) + .write.format("delta").mode("overwrite").save(s"$SCHEME://$tablePath") + } + + write(1) // first write enables the property + val ex = catalyst.util.quietly { + intercept[RuntimeException] { write(2) } + } + + assert(ex.getMessage().contains(GenerateSymlinkManifest.name)) + assert(ex.getCause().toString.contains("Test exception")) + } + } + } + + test("special partition column names") { + + def assertColNames(inputStr: String): Unit = withClue(s"input: $inputStr") { + withTempDir { tablePath => + tablePath.delete() + val inputLines = inputStr.trim.stripMargin.trim.split("\n").toSeq + require(inputLines.size > 0) + val input = spark.read.json(inputLines.toDS) + val partitionCols = input.schema.fieldNames + val inputWithValue = input.withColumn("value", lit(1)) + + inputWithValue.write.format("delta").partitionBy(partitionCols: _*).save(tablePath.toString) + generateSymlinkManifest(tablePath.toString) + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = inputLines.size) + } + } + + assertColNames("""{ " " : 0 }""") + assertColNames("""{ "%" : 0 }""") + assertColNames("""{ "a.b." : 0 }""") + assertColNames("""{ "a_b" : 0 }""") + assertColNames("""{ "a b" : 0 }""") + } + + test("special partition column values") { + withTempDir { tablePath => + tablePath.delete() + val inputStr = """ + |{ "part1" : 1, "part2": "$0$", "value" : 1 } + |{ "part1" : null, "part2": "_1_", "value" : 1 } + |{ "part1" : 1, "part2": "", "value" : 1 } + |{ "part1" : null, "part2": " ", "value" : 1 } + |{ "part1" : 1, "part2": " ", "value" : 1 } + |{ "part1" : null, "part2": "/", "value" : 1 } + |{ "part1" : 1, "part2": null, "value" : 1 } + |""" + val input = spark.read.json(inputStr.trim.stripMargin.trim.split("\n").toSeq.toDS) + input.write.format("delta").partitionBy("part1", "part2").save(tablePath.toString) + generateSymlinkManifest(tablePath.toString) + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = 7) + } + } + + test("root table path with escapable chars like space") { + withTempDir { p => + val tablePath = new File(p.toString, "path with space") + spark.createDataset(spark.sparkContext.parallelize(1 to 100, 1)).toDF("value") + .withColumn("part", $"value" % 2) + .write.format("delta").partitionBy("part").save(tablePath.toString) + + generateSymlinkManifest(tablePath.toString) + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = 2) + } + } + + def assertManifest(tablePath: File, expectSameFiles: Boolean, expectedNumFiles: Int): Unit = { + val deltaSnapshot = DeltaLog.forTable(spark, tablePath.toString).update() + val manifestPath = new File(tablePath, GenerateSymlinkManifest.MANIFEST_LOCATION) + + if (!manifestPath.exists) { + assert(expectedNumFiles == 0 && !expectSameFiles) + return + } + + // Validate the expected number of files are present in the manifest + val filesInManifest = spark.read.text(manifestPath.toString).select("value").as[String] + .map { _.stripPrefix("file:") }.toDF("file") + assert(filesInManifest.count() == expectedNumFiles) + + // Validate that files in the latest version of DeltaLog is same as those in the manifest + val filesInLog = deltaSnapshot.allFiles.map { addFile => + // Note: this unescapes the relative path in `addFile` + DeltaFileOperations.absolutePath(tablePath.toString, addFile.path).toString + }.toDF("file") + if (expectSameFiles) { + checkAnswer(filesInManifest, filesInLog.toDF()) + + // Validate that each file in the manifest is actually present in table. This mainly checks + // whether the file names in manifest are not escaped and therefore are readable directly + // by Hadoop APIs. + val fs = new Path(manifestPath.toString).getFileSystem(spark.sessionState.newHadoopConf()) + spark.read.text(manifestPath.toString).select("value").as[String].collect().foreach { p => + assert(fs.exists(new Path(p)), s"path $p in manifest not found in file system") + } + } else { + assert(filesInManifest.as[String].collect().toSet != filesInLog.as[String].collect().toSet) + } + + // If there are partitioned files, make sure the partitions values read from them are the + // same as those in the table. + val partitionCols = deltaSnapshot.metadata.partitionColumns.map(x => s"`$x`") + if (partitionCols.nonEmpty && expectSameFiles && expectedNumFiles > 0) { + val partitionsInManifest = spark.read.text(manifestPath.toString) + .selectExpr(partitionCols: _*).distinct() + val partitionsInData = spark.read.format("delta").load(tablePath.toString) + .selectExpr(partitionCols: _*).distinct() + checkAnswer(partitionsInManifest, partitionsInData) + } + } + + protected def withIncrementalManifest(tablePath: File, enabled: Boolean)(func: => Unit): Unit = { + if (tablePath.exists()) { + val deltaLog = DeltaLog.forTable(spark, tablePath) + val latestMetadata = deltaLog.update().metadata + if (DeltaConfigs.SYMLINK_FORMAT_MANIFEST_ENABLED.fromMetaData(latestMetadata) != enabled) { + // Update the metadata of the table + val config = Map(DeltaConfigs.SYMLINK_FORMAT_MANIFEST_ENABLED.key -> enabled.toString) + val txn = deltaLog.startTransaction() + val metadata = txn.metadata + val newMetadata = metadata.copy(configuration = metadata.configuration ++ config) + txn.commit(newMetadata :: Nil, DeltaOperations.SetTableProperties(config)) + } + } + func + } + + protected def generateSymlinkManifest(tablePath: String): Unit = { + val deltaLog = DeltaLog.forTable(spark, tablePath) + GenerateSymlinkManifest.generateFullManifest(spark, deltaLog) + } +} + +class SymlinkManifestFailureTestAbstractFileSystem( + uri: URI, + conf: org.apache.hadoop.conf.Configuration) + extends org.apache.hadoop.fs.DelegateToFileSystem( + uri, + new SymlinkManifestFailureTestFileSystem, + conf, + SymlinkManifestFailureTestFileSystem.SCHEME, + false) { + + // Implementation copied from RawLocalFs + import org.apache.hadoop.fs.local.LocalConfigKeys + import org.apache.hadoop.fs._ + + override def getUriDefaultPort(): Int = -1 + override def getServerDefaults(): FsServerDefaults = LocalConfigKeys.getServerDefaults() + override def isValidName(src: String): Boolean = true +} + + +class SymlinkManifestFailureTestFileSystem extends RawLocalFileSystem { + + private var uri: URI = _ + override def getScheme: String = SymlinkManifestFailureTestFileSystem.SCHEME + + override def initialize(name: URI, conf: Configuration): Unit = { + uri = URI.create(name.getScheme + ":///") + super.initialize(name, conf) + } + + override def getUri(): URI = if (uri == null) { + // RawLocalFileSystem's constructor will call this one before `initialize` is called. + // Just return the super's URI to avoid NPE. + super.getUri + } else { + uri + } + + // Create function used by the parquet writer + override def create( + path: Path, + overwrite: Boolean, + bufferSize: Int, + replication: Short, + blockSize: Long, + progress: Progressable): FSDataOutputStream = { + if (path.toString.contains(GenerateSymlinkManifest.MANIFEST_LOCATION)) { + throw new RuntimeException("Test exception") + } + super.create(path, overwrite, bufferSize, replication, blockSize, null) + } +} + +object SymlinkManifestFailureTestFileSystem { + val SCHEME = "testScheme" +} + From 0cacfcc97d8f0345f04fb5094cc35ddaae19c3f8 Mon Sep 17 00:00:00 2001 From: Rahul Mahadev Date: Fri, 15 Nov 2019 01:34:13 +0000 Subject: [PATCH 14/44] [SC-25746][DELTA] Changing the name of Feature Flag to align with naming convention ## What changes were proposed in this pull request? Changing the name of the feature flag key so that it aligns with the naming convention of other feature flags. ## How was this patch tested? (Please explain how this patch was tested. E.g. unit tests, integration tests, manual tests) (If this patch involves UI changes, please attach a screenshot; otherwise, remove this) Please review https://spark.apache.org/contributing.html before opening a pull request. Author: Rahul Mahadev #7008 is resolved by rahulsmahadev/changeFlagName. GitOrigin-RevId: cc3448768418e24975f33989857293dac5fcb265 --- .../scala/org/apache/spark/sql/delta/sources/DeltaSQLConf.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/org/apache/spark/sql/delta/sources/DeltaSQLConf.scala b/src/main/scala/org/apache/spark/sql/delta/sources/DeltaSQLConf.scala index a7243f6694a..feaadd74c27 100644 --- a/src/main/scala/org/apache/spark/sql/delta/sources/DeltaSQLConf.scala +++ b/src/main/scala/org/apache/spark/sql/delta/sources/DeltaSQLConf.scala @@ -207,7 +207,7 @@ object DeltaSQLConf { .createWithDefault(10000L) val MERGE_INSERT_ONLY_ENABLED = - buildConf("merge.insertOnly.enabled") + buildConf("merge.optimizeInsertOnlyMerge.enabled") .internal() .doc( """ From 29c23d42434c3816ca9fdf7288b71658d2c5714e Mon Sep 17 00:00:00 2001 From: Andrew Fogarty Date: Mon, 18 Nov 2019 18:55:42 +0000 Subject: [PATCH 15/44] [DELTA-OSS-EXTERNAL] OpType is case class This PR makes the fields of `OpType` (`typeName` and `description`) accessible so that custom logging implementations can log them. Closes delta-io/delta#253 Author: Andrew Fogarty GitOrigin-RevId: 0770e2a9ba127cc7fea0b341630051c2ef70a7fb --- .../scala/com/databricks/spark/util/DatabricksLogging.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/com/databricks/spark/util/DatabricksLogging.scala b/src/main/scala/com/databricks/spark/util/DatabricksLogging.scala index e59e47beba7..3bb3cfe875b 100644 --- a/src/main/scala/com/databricks/spark/util/DatabricksLogging.scala +++ b/src/main/scala/com/databricks/spark/util/DatabricksLogging.scala @@ -31,7 +31,7 @@ object TagDefinitions { object TAG_OP_TYPE extends TagDefinition } -class OpType(typeName: String, description: String) +case class OpType(typeName: String, description: String) class MetricDefinition From 9495d5ef21c9da6e29a1632f98d5f2a174501e4e Mon Sep 17 00:00:00 2001 From: Burak Yavuz Date: Mon, 18 Nov 2019 22:30:22 +0000 Subject: [PATCH 16/44] [SC-25431][DELTA][TEST] Refactor Delta Schema Enforcement tests in preparation for Spark 3.0 ## What changes were proposed in this pull request? Adds tests for schema enforcement, which we can run once we start implementing Delta as a V2 data source. ## How was this patch tested? Existing tests Author: Burak Yavuz Author: Burak Yavuz #6963 is resolved by brkyvz/schemaEnforcementTests. GitOrigin-RevId: 78fe293c662da4b7fdb1ecb16febc1f45408b912 --- .../delta/schema/SchemaEnforcementSuite.scala | 857 ++++++++++++++++++ 1 file changed, 857 insertions(+) create mode 100644 src/test/scala/org/apache/spark/sql/delta/schema/SchemaEnforcementSuite.scala diff --git a/src/test/scala/org/apache/spark/sql/delta/schema/SchemaEnforcementSuite.scala b/src/test/scala/org/apache/spark/sql/delta/schema/SchemaEnforcementSuite.scala new file mode 100644 index 00000000000..b67d117a8e2 --- /dev/null +++ b/src/test/scala/org/apache/spark/sql/delta/schema/SchemaEnforcementSuite.scala @@ -0,0 +1,857 @@ +/* + * Copyright 2019 Databricks, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.spark.sql.delta.schema + +import java.io.File + +// scalastyle:off import.ordering.noEmptyLine +import org.apache.spark.sql.delta.{DeltaLog, DeltaOptions} +import org.apache.spark.sql.delta.actions.SingleAction +import org.apache.spark.sql.delta.sources.DeltaSQLConf +import org.apache.spark.sql.delta.util.{FileNames, JsonUtils} + +import org.apache.spark.SparkConf +import org.apache.spark.sql._ +import org.apache.spark.sql.execution.streaming.MemoryStream +import org.apache.spark.sql.functions._ +import org.apache.spark.sql.internal.SQLConf +import org.apache.spark.sql.streaming.StreamingQueryException +import org.apache.spark.sql.test.{SharedSparkSession, SQLTestUtils} +import org.apache.spark.sql.types._ + +sealed trait SaveOperation { + def apply(dfw: DataFrameWriter[_]): Unit +} + +case class SaveWithPath(path: String = null) extends SaveOperation { + override def apply(dfw: DataFrameWriter[_]): Unit = { + if (path == null) dfw.save() else dfw.save(path) + } +} + +// Not supported yet +case class SaveAsTable(tableName: String) extends SaveOperation { + override def apply(dfw: DataFrameWriter[_]): Unit = dfw.saveAsTable(tableName) +} + +sealed trait SchemaEnforcementSuiteBase + extends QueryTest with SharedSparkSession { + protected def enableAutoMigration(f: => Unit): Unit = { + withSQLConf(DeltaSQLConf.DELTA_SCHEMA_AUTO_MIGRATE.key -> "true") { + f + } + } + + protected def disableAutoMigration(f: => Unit): Unit = { + withSQLConf(DeltaSQLConf.DELTA_SCHEMA_AUTO_MIGRATE.key -> "false") { + f + } + } +} + +sealed trait BatchWriterTest extends SchemaEnforcementSuiteBase with SharedSparkSession { + + def saveOperation: SaveOperation + + implicit class RichDataFrameWriter(dfw: DataFrameWriter[_]) { + def append(path: File): Unit = { + saveOperation(dfw.format("delta").mode("append").option("path", path.getAbsolutePath)) + } + + def overwrite(path: File): Unit = { + saveOperation(dfw.format("delta").mode("overwrite").option("path", path.getAbsolutePath)) + } + } + + def equivalenceTest(testName: String)(f: => Unit): Unit = { + test(s"batch: $testName") { + saveOperation match { + case _: SaveWithPath => f + case SaveAsTable(tbl) => withTable(tbl) { f } + } + } + } +} + +trait AppendSaveModeTests extends BatchWriterTest { + import testImplicits._ + + equivalenceTest("reject schema changes by default") { + disableAutoMigration { + withTempDir { dir => + spark.range(10).write.append(dir) + val e = intercept[AnalysisException] { + spark.range(10).withColumn("part", 'id + 1).write.append(dir) + } + assert(e.getMessage.contains(DeltaOptions.MERGE_SCHEMA_OPTION)) + } + } + } + + equivalenceTest("allow schema changes when autoMigrate is enabled") { + enableAutoMigration { + withTempDir { dir => + spark.range(10).write.append(dir) + spark.range(10).withColumn("part", 'id + 1).write.append(dir) + assert(spark.read.format("delta").load(dir.getAbsolutePath).schema.length == 2) + } + } + } + + equivalenceTest("disallow schema changes when autoMigrate enabled but writer config disabled") { + enableAutoMigration { + withTempDir { dir => + spark.range(10).write.append(dir) + val e = intercept[AnalysisException] { + spark.range(10).withColumn("part", 'id + 1).write + .option(DeltaOptions.MERGE_SCHEMA_OPTION, "false").append(dir) + } + assert(e.getMessage.contains(DeltaOptions.MERGE_SCHEMA_OPTION)) + } + } + } + + equivalenceTest("allow schema change with option") { + disableAutoMigration { + withTempDir { dir => + spark.range(10).write.append(dir) + spark.range(10).withColumn("part", 'id + 1).write + .option(DeltaOptions.MERGE_SCHEMA_OPTION, "true").append(dir) + assert(spark.read.format("delta").load(dir.getAbsolutePath).schema.length == 2) + } + } + } + + equivalenceTest("JSON ETL workflow, schema merging NullTypes") { + enableAutoMigration { + val row1 = """{"key":"abc","id":null,"extra":1}""" + val row2 = """{"key":"def","id":2,"extra":null}""" + val row3 = """{"key":"ghi","id":null,"extra":3}""" + withTempDir { dir => + val schema1 = new StructType() + .add("key", StringType).add("id", NullType).add("extra", IntegerType) + val schema2 = new StructType() + .add("key", StringType).add("id", IntegerType).add("extra", NullType) + spark.read.schema(schema1).json(Seq(row1).toDS()).write.append(dir) + spark.read.schema(schema2).json(Seq(row2).toDS()).write.append(dir) + spark.read.schema(schema1).json(Seq(row3).toDS()).write.append(dir) + + checkAnswer( + spark.read.format("delta").load(dir.getAbsolutePath), + Row("abc", null, 1) :: Row("def", 2, null) :: Row("ghi", null, 3) :: Nil + ) + } + } + } + + equivalenceTest("JSON ETL workflow, schema merging NullTypes - nested struct") { + enableAutoMigration { + val row1 = """{"key":"abc","top":{"id":null,"extra":1}}""" + val row2 = """{"key":"def","top":{"id":2,"extra":null}}""" + val row3 = """{"key":"ghi","top":{"id":null,"extra":3}}""" + withTempDir { dir => + val schema1 = new StructType().add("key", StringType) + .add("top", new StructType().add("id", NullType).add("extra", IntegerType)) + val schema2 = new StructType().add("key", StringType) + .add("top", new StructType().add("id", IntegerType).add("extra", NullType)) + val mergedSchema = new StructType().add("key", StringType) + .add("top", new StructType().add("id", IntegerType).add("extra", IntegerType)) + spark.read.schema(schema1).json(Seq(row1).toDS()).write.append(dir) + spark.read.schema(schema2).json(Seq(row2).toDS()).write.append(dir) + assert(spark.read.format("delta").load(dir.getAbsolutePath).schema === mergedSchema) + spark.read.schema(schema1).json(Seq(row3).toDS()).write.append(dir) + assert(spark.read.format("delta").load(dir.getAbsolutePath).schema === mergedSchema) + + checkAnswer( + spark.read.format("delta").load(dir.getAbsolutePath), + Row("abc", Row(null, 1)) :: Row("def", Row(2, null)) :: Row("ghi", Row(null, 3)) :: Nil + ) + } + } + } + + equivalenceTest("JSON ETL workflow, schema merging NullTypes - throw error on complex types") { + enableAutoMigration { + val row1 = """{"key":"abc","top":[]}""" + val row2 = """{"key":"abc","top":[{"id":null}]}""" + withTempDir { dir => + val schema1 = new StructType().add("key", StringType).add("top", ArrayType(NullType)) + val schema2 = new StructType().add("key", StringType) + .add("top", ArrayType(new StructType().add("id", NullType))) + val e1 = intercept[AnalysisException] { + spark.read.schema(schema1).json(Seq(row1).toDS()).write.append(dir) + } + assert(e1.getMessage.contains("NullType")) + val e2 = intercept[AnalysisException] { + spark.read.schema(schema2).json(Seq(row2).toDS()).write.append(dir) + } + assert(e2.getMessage.contains("NullType")) + } + } + } + + equivalenceTest("JSON ETL workflow, NullType being only data column") { + enableAutoMigration { + val row1 = """{"key":"abc","id":null}""" + withTempDir { dir => + val schema1 = new StructType().add("key", StringType).add("id", NullType) + val e = intercept[AnalysisException] { + spark.read.schema(schema1).json(Seq(row1).toDS()).write.partitionBy("key").append(dir) + } + assert(e.getMessage.contains("NullType have been dropped")) + } + } + } + + equivalenceTest("JSON ETL workflow, NullType partition column should fail") { + enableAutoMigration { + val row1 = """{"key":"abc","id":null}""" + withTempDir { dir => + val schema1 = new StructType().add("key", StringType).add("id", NullType) + intercept[AnalysisException] { + spark.read.schema(schema1).json(Seq(row1).toDS()).write.partitionBy("id").append(dir) + } + intercept[AnalysisException] { + // check case sensitivity with regards to column dropping + spark.read.schema(schema1).json(Seq(row1).toDS()).write.partitionBy("iD").append(dir) + } + } + } + } + + equivalenceTest("reject columns that only differ by case - append") { + withTempDir { dir => + withSQLConf(SQLConf.CASE_SENSITIVE.key -> "true") { + intercept[AnalysisException] { + spark.range(10).withColumn("ID", 'id + 1).write.append(dir) + } + + intercept[AnalysisException] { + spark.range(10).withColumn("ID", 'id + 1).write + .option(DeltaOptions.MERGE_SCHEMA_OPTION, "true").append(dir) + } + + intercept[AnalysisException] { + spark.range(10).withColumn("a", 'id + 1).write + .partitionBy("a", "A") + .option(DeltaOptions.MERGE_SCHEMA_OPTION, "true").append(dir) + } + } + } + } +} + +trait AppendOutputModeTests extends SchemaEnforcementSuiteBase with SharedSparkSession + with SQLTestUtils { + import testImplicits._ + + testQuietly("reject schema changes by default - streaming") { + withTempDir { dir => + spark.range(10).write.format("delta").save(dir.getAbsolutePath) + + val memStream = MemoryStream[Long] + val stream = memStream.toDS().toDF("value1234") // different column name + .writeStream + .option("checkpointLocation", new File(dir, "_checkpoint").getAbsolutePath) + .format("delta") + .start(dir.getAbsolutePath) + try { + disableAutoMigration { + val e = intercept[StreamingQueryException] { + memStream.addData(1L) + stream.processAllAvailable() + } + assert(e.cause.isInstanceOf[AnalysisException]) + assert(e.cause.getMessage.contains(DeltaOptions.MERGE_SCHEMA_OPTION)) + } + } finally { + stream.stop() + } + } + } + + testQuietly("reject schema changes when autoMigrate enabled but writer config disabled") { + withTempDir { dir => + spark.range(10).write.format("delta").save(dir.getAbsolutePath) + + val memStream = MemoryStream[Long] + val stream = memStream.toDS().toDF("value1234") // different column name + .writeStream + .option("checkpointLocation", new File(dir, "_checkpoint").getAbsolutePath) + .format("delta") + .option(DeltaOptions.MERGE_SCHEMA_OPTION, "false") + .start(dir.getAbsolutePath) + try { + enableAutoMigration { + val e = intercept[StreamingQueryException] { + memStream.addData(1L) + stream.processAllAvailable() + } + assert(e.cause.isInstanceOf[AnalysisException]) + assert(e.cause.getMessage.contains(DeltaOptions.MERGE_SCHEMA_OPTION)) + } + } finally { + stream.stop() + } + } + } + + test("allow schema changes when autoMigrate is enabled - streaming") { + withTempDir { dir => + spark.range(10).write.format("delta").save(dir.getAbsolutePath) + + enableAutoMigration { + val memStream = MemoryStream[Long] + val stream = memStream.toDS().toDF("value1234") // different column name + .writeStream + .option("checkpointLocation", new File(dir, "_checkpoint").getAbsolutePath) + .format("delta") + .start(dir.getAbsolutePath) + try { + memStream.addData(1L) + stream.processAllAvailable() + + assert(spark.read.format("delta").load(dir.getAbsolutePath).schema.length == 2) + } finally { + stream.stop() + } + } + } + } + + test("allow schema change with option - streaming") { + withTempDir { dir => + spark.range(10).write.format("delta").save(dir.getAbsolutePath) + + val memStream = MemoryStream[Long] + val stream = memStream.toDS().toDF("value1234") // different column name + .writeStream + .option("checkpointLocation", new File(dir, "_checkpoint").getAbsolutePath) + .option(DeltaOptions.MERGE_SCHEMA_OPTION, "true") + .format("delta") + .start(dir.getAbsolutePath) + try { + disableAutoMigration { + memStream.addData(1L) + stream.processAllAvailable() + + assert(spark.read.format("delta").load(dir.getAbsolutePath).schema.length == 2) + } + } finally { + stream.stop() + } + } + } + + testQuietly("JSON ETL workflow, reject NullTypes") { + enableAutoMigration { + val row1 = """{"key":"abc","id":null}""" + withTempDir { dir => + val schema = new StructType().add("key", StringType).add("id", NullType) + + val memStream = MemoryStream[String] + val stream = memStream.toDS().select(from_json('value, schema).as("value")) + .select($"value.*") + .writeStream + .option("checkpointLocation", new File(dir, "_checkpoint").getAbsolutePath) + .format("delta") + .start(dir.getAbsolutePath) + + try { + val e = intercept[StreamingQueryException] { + memStream.addData(row1) + stream.processAllAvailable() + } + assert(e.cause.isInstanceOf[AnalysisException]) + assert(e.cause.getMessage.contains("NullType")) + } finally { + stream.stop() + } + } + } + } + + testQuietly("JSON ETL workflow, reject NullTypes on nested column") { + enableAutoMigration { + val row1 = """{"key":"abc","id":{"a":null}}""" + withTempDir { dir => + val schema = new StructType().add("key", StringType) + .add("id", new StructType().add("a", NullType)) + + val memStream = MemoryStream[String] + val stream = memStream.toDS().select(from_json('value, schema).as("value")) + .select($"value.*") + .writeStream + .option("checkpointLocation", new File(dir, "_checkpoint").getAbsolutePath) + .format("delta") + .start(dir.getAbsolutePath) + + try { + val e = intercept[StreamingQueryException] { + memStream.addData(row1) + stream.processAllAvailable() + } + assert(e.cause.isInstanceOf[AnalysisException]) + assert(e.cause.getMessage.contains("NullType")) + } finally { + stream.stop() + } + } + } + } +} + +trait OverwriteSaveModeTests extends BatchWriterTest { + import testImplicits._ + + equivalenceTest("reject schema overwrites by default") { + disableAutoMigration { + withTempDir { dir => + spark.range(10).write.overwrite(dir) + val e = intercept[AnalysisException] { + spark.range(10).withColumn("part", 'id + 1).write.overwrite(dir) + } + assert(e.getMessage.contains(DeltaOptions.OVERWRITE_SCHEMA_OPTION)) + } + } + } + + equivalenceTest("can overwrite schema when using overwrite mode - option") { + disableAutoMigration { + withTempDir { dir => + spark.range(5).toDF("id").write.overwrite(dir) + spark.range(5).toDF("value").write.option(DeltaOptions.OVERWRITE_SCHEMA_OPTION, "true") + .overwrite(dir) + + val df = spark.read.format("delta").load(dir.getAbsolutePath) + assert(df.schema.fieldNames === Array("value")) + } + } + } + + equivalenceTest("when autoMerge sqlConf is enabled, we merge schemas") { + enableAutoMigration { + withTempDir { dir => + spark.range(5).toDF("id").write.overwrite(dir) + spark.range(5).toDF("value").write.overwrite(dir) + + val df = spark.read.format("delta").load(dir.getAbsolutePath) + assert(df.schema.fieldNames === Array("id", "value")) + } + } + } + + equivalenceTest("reject migration when autoMerge sqlConf is enabled and writer config disabled") { + enableAutoMigration { + withTempDir { dir => + spark.range(5).toDF("id").write.overwrite(dir) + intercept[AnalysisException] { + spark.range(5).toDF("value").write.option(DeltaOptions.MERGE_SCHEMA_OPTION, "false") + .overwrite(dir) + } + + val df = spark.read.format("delta").load(dir.getAbsolutePath) + assert(df.schema.fieldNames === Array("id")) + } + } + } + + equivalenceTest("schema merging with replaceWhere - sqlConf") { + enableAutoMigration { + withTempDir { dir => + spark.range(5).toDF("id").withColumn("part", 'id % 2).write + .partitionBy("part") + .overwrite(dir) + Seq((1L, 0L), (2L, 0L)).toDF("value", "part").write + .option(DeltaOptions.REPLACE_WHERE_OPTION, "part = 0") + .overwrite(dir) + + val df = spark.read.format("delta").load(dir.getAbsolutePath) + assert(df.schema.fieldNames === Array("id", "part", "value")) + } + } + } + + equivalenceTest("schema merging with replaceWhere - option") { + disableAutoMigration { + withTempDir { dir => + spark.range(5).toDF("id").withColumn("part", 'id % 2).write + .partitionBy("part") + .overwrite(dir) + Seq((1L, 0L), (2L, 0L)).toDF("value", "part").write + .option(DeltaOptions.REPLACE_WHERE_OPTION, "part = 0") + .option(DeltaOptions.MERGE_SCHEMA_OPTION, "true") + .overwrite(dir) + + val df = spark.read.format("delta").load(dir.getAbsolutePath) + assert(df.schema.fieldNames === Array("id", "part", "value")) + } + } + } + + equivalenceTest("schema merging with replaceWhere - option case insensitive") { + disableAutoMigration { + withTempDir { dir => + spark.range(5).toDF("id").withColumn("part", 'id % 2).write + .partitionBy("part") + .overwrite(dir) + Seq((1L, 0L), (2L, 0L)).toDF("value", "part").write + .option("RePlAcEwHeRe", "part = 0") + .option("mErGeScHeMa", "true") + .overwrite(dir) + + val df = spark.read.format("delta").load(dir.getAbsolutePath) + assert(df.schema.fieldNames === Array("id", "part", "value")) + } + } + } + + equivalenceTest("reject schema merging with replaceWhere - overwrite option") { + disableAutoMigration { + withTempDir { dir => + spark.range(5).toDF("id").withColumn("part", 'id % 2).write + .partitionBy("part") + .overwrite(dir) + val e = intercept[AnalysisException] { + Seq((1L, 0L), (2L, 0L)).toDF("value", "part").write + .option(DeltaOptions.REPLACE_WHERE_OPTION, "part = 0") + .option(DeltaOptions.OVERWRITE_SCHEMA_OPTION, "true") + .overwrite(dir) + } + assert(e.getMessage.contains(DeltaOptions.MERGE_SCHEMA_OPTION)) + } + } + } + + equivalenceTest("reject schema merging with replaceWhere - no option") { + disableAutoMigration { + withTempDir { dir => + spark.range(5).toDF("id").withColumn("part", 'id % 2).write + .partitionBy("part") + .overwrite(dir) + val e = intercept[AnalysisException] { + Seq((1L, 0L), (2L, 0L)).toDF("value", "part").write + .partitionBy("part") + .option(DeltaOptions.REPLACE_WHERE_OPTION, "part = 0") + .overwrite(dir) + } + assert(e.getMessage.contains(DeltaOptions.MERGE_SCHEMA_OPTION)) + } + } + } + + equivalenceTest("reject schema merging with replaceWhere - option set to false, config true") { + enableAutoMigration { + withTempDir { dir => + spark.range(5).toDF("id").withColumn("part", 'id % 2).write + .partitionBy("part") + .overwrite(dir) + val e = intercept[AnalysisException] { + Seq((1L, 0L), (2L, 0L)).toDF("value", "part").write + .partitionBy("part") + .option(DeltaOptions.REPLACE_WHERE_OPTION, "part = 0") + .option(DeltaOptions.MERGE_SCHEMA_OPTION, "false") + .overwrite(dir) + } + assert(e.getMessage.contains(DeltaOptions.MERGE_SCHEMA_OPTION)) + } + } + } + + equivalenceTest("reject change partitioning with overwrite - sqlConf") { + enableAutoMigration { + withTempDir { dir => + spark.range(5).toDF("id").write + .overwrite(dir) + val e = intercept[AnalysisException] { + spark.range(5).toDF("id").withColumn("part", 'id % 2).write + .partitionBy("part") + .overwrite(dir) + } + assert(e.getMessage.contains(DeltaOptions.OVERWRITE_SCHEMA_OPTION)) + + val deltaLog = DeltaLog.forTable(spark, dir) + assert(deltaLog.snapshot.metadata.partitionColumns === Nil) + assert(deltaLog.snapshot.metadata.schema.fieldNames === Array("id")) + } + } + } + + equivalenceTest("can change partitioning with overwrite - option") { + disableAutoMigration { + withTempDir { dir => + spark.range(5).toDF("id").write + .overwrite(dir) + spark.range(5).toDF("id").withColumn("part", 'id % 2).write + .partitionBy("part") + .option(DeltaOptions.OVERWRITE_SCHEMA_OPTION, "true") + .overwrite(dir) + + val deltaLog = DeltaLog.forTable(spark, dir) + assert(deltaLog.snapshot.metadata.partitionColumns === Seq("part")) + assert(deltaLog.snapshot.metadata.schema.fieldNames === Array("id", "part")) + } + } + } + + equivalenceTest("can't change partitioning with overwrite and replaceWhere - option") { + disableAutoMigration { + withTempDir { dir => + spark.range(5).toDF("id").withColumn("part", 'id % 2).write + .partitionBy("part") + .overwrite(dir) + + intercept[AnalysisException] { + spark.range(5).toDF("id").withColumn("part", lit(0L)).withColumn("test", 'id + 1).write + .partitionBy("part", "test") + .option(DeltaOptions.REPLACE_WHERE_OPTION, "part = 0") + .option(DeltaOptions.OVERWRITE_SCHEMA_OPTION, "true") + .overwrite(dir) + } + } + } + } + + equivalenceTest("can drop columns with overwriteSchema") { + disableAutoMigration { + withTempDir { dir => + spark.range(5).toDF("id").withColumn("part", 'id % 2).write + .overwrite(dir) + spark.range(5).toDF("id").write + .option(DeltaOptions.OVERWRITE_SCHEMA_OPTION, "true") + .overwrite(dir) + + val deltaLog = DeltaLog.forTable(spark, dir) + assert(deltaLog.snapshot.metadata.partitionColumns === Nil) + assert(deltaLog.snapshot.metadata.schema.fieldNames === Array("id")) + } + } + } + + equivalenceTest("can change column data type with overwriteSchema") { + disableAutoMigration { + withTempDir { dir => + val deltaLog = DeltaLog.forTable(spark, dir) + spark.range(5).toDF("id").write + .overwrite(dir) + assert(deltaLog.snapshot.metadata.schema.head === StructField("id", LongType)) + spark.range(5).toDF("id").selectExpr("cast(id as string) as id").write + .option(DeltaOptions.OVERWRITE_SCHEMA_OPTION, "true") + .overwrite(dir) + assert(deltaLog.snapshot.metadata.schema.head === StructField("id", StringType)) + } + } + } + + equivalenceTest("reject columns that only differ by case - overwrite") { + withTempDir { dir => + withSQLConf(SQLConf.CASE_SENSITIVE.key -> "true") { + intercept[AnalysisException] { + spark.range(10).withColumn("ID", 'id + 1).write.overwrite(dir) + } + + intercept[AnalysisException] { + spark.range(10).withColumn("ID", 'id + 1).write + .option(DeltaOptions.OVERWRITE_SCHEMA_OPTION, "true") + .overwrite(dir) + } + + intercept[AnalysisException] { + spark.range(10).withColumn("a", 'id + 1).write + .partitionBy("a", "A") + .option(DeltaOptions.OVERWRITE_SCHEMA_OPTION, "true") + .overwrite(dir) + } + } + } + } +} + +trait CompleteOutputModeTests extends SchemaEnforcementSuiteBase with SharedSparkSession + with SQLTestUtils { + import testImplicits._ + + testQuietly("reject complete mode with new schema by default") { + disableAutoMigration { + withTempDir { dir => + val memStream = MemoryStream[Long] + val query = memStream.toDS().toDF("id") + .withColumn("part", 'id % 3) + .groupBy("part") + .count() + + val stream1 = query.writeStream + .option("checkpointLocation", new File(dir, "_checkpoint").getAbsolutePath) + .outputMode("complete") + .format("delta") + .start(dir.getAbsolutePath) + try { + memStream.addData(1L) + stream1.processAllAvailable() + } finally { + stream1.stop() + } + + assert(spark.read.format("delta").load(dir.getAbsolutePath).schema.length == 2) + + val stream2 = query.withColumn("test", lit("abc")).writeStream + .option("checkpointLocation", new File(dir, "_checkpoint").getAbsolutePath) + .outputMode("complete") + .format("delta") + .start(dir.getAbsolutePath) + try { + val e = intercept[StreamingQueryException] { + memStream.addData(2L) + stream2.processAllAvailable() + } + assert(e.cause.isInstanceOf[AnalysisException]) + assert(e.cause.getMessage.contains(DeltaOptions.OVERWRITE_SCHEMA_OPTION)) + + } finally { + stream2.stop() + } + } + } + } + + test("complete mode can overwrite schema with option") { + disableAutoMigration { + withTempDir { dir => + val memStream = MemoryStream[Long] + val query = memStream.toDS().toDF("id") + .withColumn("part", 'id % 3) + .groupBy("part") + .count() + + val stream1 = query.writeStream + .option("checkpointLocation", new File(dir, "_checkpoint").getAbsolutePath) + .option(DeltaOptions.OVERWRITE_SCHEMA_OPTION, "true") + .outputMode("complete") + .format("delta") + .start(dir.getAbsolutePath) + try { + memStream.addData(1L) + stream1.processAllAvailable() + } finally { + stream1.stop() + } + + assert(spark.read.format("delta").load(dir.getAbsolutePath).schema.length == 2) + + val stream2 = query.withColumn("test", lit("abc")).writeStream + .option("checkpointLocation", new File(dir, "_checkpoint").getAbsolutePath) + .option(DeltaOptions.OVERWRITE_SCHEMA_OPTION, "true") + .outputMode("complete") + .format("delta") + .start(dir.getAbsolutePath) + try { + memStream.addData(2L) + stream2.processAllAvailable() + + memStream.addData(3L) + stream2.processAllAvailable() + } finally { + stream2.stop() + } + + val df = spark.read.format("delta").load(dir.getAbsolutePath) + assert(df.schema.length == 3) + + val deltaLog = DeltaLog.forTable(spark, dir) + val lastCommitFile = deltaLog.store.listFrom(FileNames.deltaFile(deltaLog.logPath, 0L)) + .map(_.getPath).filter(FileNames.isDeltaFile).toArray.last + val lastCommitContainsMetadata = deltaLog.store.read(lastCommitFile) + .exists(JsonUtils.mapper.readValue[SingleAction](_).metaData != null) + + assert(!lastCommitContainsMetadata, + "Metadata shouldn't be updated as long as schema doesn't change") + + checkAnswer( + df, + Row(0L, 1L, "abc") :: Row(1L, 1L, "abc") :: Row(2L, 1L, "abc") :: Nil) + } + } + } + + test("complete mode behavior with autoMigrate enabled is to migrate schema") { + enableAutoMigration { + withTempDir { dir => + val memStream = MemoryStream[Long] + val query = memStream.toDS().toDF("id") + .withColumn("part", 'id % 3) + .groupBy("part") + .count() + + val stream1 = query.writeStream + .option("checkpointLocation", new File(dir, "_checkpoint").getAbsolutePath) + .outputMode("complete") + .format("delta") + .start(dir.getAbsolutePath) + try { + memStream.addData(1L) + stream1.processAllAvailable() + } finally { + stream1.stop() + } + + assert(spark.read.format("delta").load(dir.getAbsolutePath).schema.length == 2) + + val stream2 = query.withColumn("test", lit("abc")).writeStream + .option("checkpointLocation", new File(dir, "_checkpoint").getAbsolutePath) + .outputMode("complete") + .format("delta") + .start(dir.getAbsolutePath) + try { + memStream.addData(2L) + stream2.processAllAvailable() + + memStream.addData(3L) + stream2.processAllAvailable() + } finally { + stream2.stop() + } + + val df = spark.read.format("delta").load(dir.getAbsolutePath) + assert(df.schema.length == 3) + + val deltaLog = DeltaLog.forTable(spark, dir) + val lastCommitFile = deltaLog.store.listFrom(FileNames.deltaFile(deltaLog.logPath, 0L)) + .map(_.getPath).filter(FileNames.isDeltaFile).toArray.last + val lastCommitContainsMetadata = deltaLog.store.read(lastCommitFile) + .exists(JsonUtils.mapper.readValue[SingleAction](_).metaData != null) + + assert(!lastCommitContainsMetadata, + "Metadata shouldn't be updated as long as schema doesn't change") + + checkAnswer( + df, + Row(0L, 1L, "abc") :: Row(1L, 1L, "abc") :: Row(2L, 1L, "abc") :: Nil) + } + } + } +} + +class SchemaEnforcementWithPathSuite extends AppendSaveModeTests with OverwriteSaveModeTests { + override val saveOperation = SaveWithPath() +} + + +class SchemaEnforcementStreamingSuite + extends AppendOutputModeTests + with CompleteOutputModeTests { +} + From 526cc526f79dc22f6e76f7a61a2ce4561e65da7a Mon Sep 17 00:00:00 2001 From: Pranav Anand Date: Fri, 22 Nov 2019 00:49:18 +0000 Subject: [PATCH 17/44] [SC-25990] Minor refactoring of the Convert To Delta internal APIs and tests **Refactor Changes** - `ConvertToDeltaSuite` now `ConvertToDeltaSuiteBase` and is now an abstract class - `ConvertToDeltaScalaSuite` became `ConvertToDeltaSuite` - Simplified test class definitions GitOrigin-RevId: a9bf5f307b4b80a4622f309379553551d0bef90a --- .../scala/io/delta/tables/DeltaTable.scala | 3 -- .../delta/tables/execution/DeltaConvert.scala | 4 +- .../sql/delta/ConvertToDeltaSQLSuite.scala | 7 ++-- .../sql/delta/ConvertToDeltaScalaSuite.scala | 38 +++++++++++++++++++ ...te.scala => ConvertToDeltaSuiteBase.scala} | 20 +--------- .../spark/sql/delta/DeltaVacuumSuite.scala | 3 +- .../sql/delta/DescribeDeltaDetailSuite.scala | 4 +- .../sql/delta/DescribeDeltaHistorySuite.scala | 3 +- 8 files changed, 54 insertions(+), 28 deletions(-) create mode 100644 src/test/scala/org/apache/spark/sql/delta/ConvertToDeltaScalaSuite.scala rename src/test/scala/org/apache/spark/sql/delta/{ConvertToDeltaSuite.scala => ConvertToDeltaSuiteBase.scala} (97%) diff --git a/src/main/scala/io/delta/tables/DeltaTable.scala b/src/main/scala/io/delta/tables/DeltaTable.scala index 2514cbb9032..eac708e9b04 100644 --- a/src/main/scala/io/delta/tables/DeltaTable.scala +++ b/src/main/scala/io/delta/tables/DeltaTable.scala @@ -526,7 +526,6 @@ object DeltaTable { partitionSchema: StructType): DeltaTable = { val tableId: TableIdentifier = spark.sessionState.sqlParser.parseTableIdentifier(identifier) DeltaConvert.executeConvert(spark, tableId, Some(partitionSchema), None) - forPath(spark, tableId.table) } /** @@ -557,7 +556,6 @@ object DeltaTable { partitionSchema: String): DeltaTable = { val tableId: TableIdentifier = spark.sessionState.sqlParser.parseTableIdentifier(identifier) DeltaConvert.executeConvert(spark, tableId, Some(StructType.fromDDL(partitionSchema)), None) - forPath(spark, tableId.table) } /** @@ -585,7 +583,6 @@ object DeltaTable { identifier: String): DeltaTable = { val tableId: TableIdentifier = spark.sessionState.sqlParser.parseTableIdentifier(identifier) DeltaConvert.executeConvert(spark, tableId, None, None) - forPath(spark, tableId.table) } /** diff --git a/src/main/scala/io/delta/tables/execution/DeltaConvert.scala b/src/main/scala/io/delta/tables/execution/DeltaConvert.scala index 843b6016df9..70bd49b455f 100644 --- a/src/main/scala/io/delta/tables/execution/DeltaConvert.scala +++ b/src/main/scala/io/delta/tables/execution/DeltaConvert.scala @@ -17,6 +17,7 @@ package io.delta.tables.execution import org.apache.spark.sql.delta.commands.{ConvertToDeltaCommand, ConvertToDeltaCommandBase} +import io.delta.tables.DeltaTable import org.apache.spark.sql.SparkSession import org.apache.spark.sql.catalyst.TableIdentifier @@ -27,9 +28,10 @@ trait DeltaConvertBase { spark: SparkSession, tableIdentifier: TableIdentifier, partitionSchema: Option[StructType], - deltaPath: Option[String]): Unit = { + deltaPath: Option[String]): DeltaTable = { val cvt = ConvertToDeltaCommand(tableIdentifier, partitionSchema, deltaPath) cvt.run(spark) + DeltaTable.forPath(spark, tableIdentifier.table) } } diff --git a/src/test/scala/org/apache/spark/sql/delta/ConvertToDeltaSQLSuite.scala b/src/test/scala/org/apache/spark/sql/delta/ConvertToDeltaSQLSuite.scala index bb4bdd40fcd..2cecde35d86 100644 --- a/src/test/scala/org/apache/spark/sql/delta/ConvertToDeltaSQLSuite.scala +++ b/src/test/scala/org/apache/spark/sql/delta/ConvertToDeltaSQLSuite.scala @@ -16,14 +16,15 @@ package org.apache.spark.sql.delta +import org.apache.spark.sql.delta.test.DeltaSQLCommandTest + class ConvertToDeltaSQLSuite - extends ConvertToDeltaSuiteBase - with org.apache.spark.sql.delta.test.DeltaSQLCommandTest + extends ConvertToDeltaSuiteBase with DeltaSQLCommandTest { override protected def convertToDelta( identifier: String, partitionSchema: Option[String] = None): Unit = { - if (!partitionSchema.isDefined) { + if (partitionSchema.isEmpty) { sql(s"convert to delta $identifier") } else { val stringSchema = partitionSchema.get diff --git a/src/test/scala/org/apache/spark/sql/delta/ConvertToDeltaScalaSuite.scala b/src/test/scala/org/apache/spark/sql/delta/ConvertToDeltaScalaSuite.scala new file mode 100644 index 00000000000..c4f4a6920b6 --- /dev/null +++ b/src/test/scala/org/apache/spark/sql/delta/ConvertToDeltaScalaSuite.scala @@ -0,0 +1,38 @@ +/* + * Copyright 2019 Databricks, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.spark.sql.delta + +import org.apache.spark.sql.types.StructType + +class ConvertToDeltaScalaSuite extends ConvertToDeltaSuiteBase { + override protected def convertToDelta( + identifier: String, + partitionSchema: Option[String] = None): Unit = { + if (partitionSchema.isDefined) { + io.delta.tables.DeltaTable.convertToDelta( + spark, + identifier, + StructType.fromDDL(partitionSchema.get) + ) + } else { + io.delta.tables.DeltaTable.convertToDelta( + spark, + identifier + ) + } + } +} diff --git a/src/test/scala/org/apache/spark/sql/delta/ConvertToDeltaSuite.scala b/src/test/scala/org/apache/spark/sql/delta/ConvertToDeltaSuiteBase.scala similarity index 97% rename from src/test/scala/org/apache/spark/sql/delta/ConvertToDeltaSuite.scala rename to src/test/scala/org/apache/spark/sql/delta/ConvertToDeltaSuiteBase.scala index 7ceafdd96db..0dde1da37f6 100644 --- a/src/test/scala/org/apache/spark/sql/delta/ConvertToDeltaSuite.scala +++ b/src/test/scala/org/apache/spark/sql/delta/ConvertToDeltaSuiteBase.scala @@ -27,10 +27,7 @@ import org.apache.spark.sql.test.SharedSparkSession import org.apache.spark.sql.types._ import org.apache.spark.util.Utils -class ConvertToDeltaSuite - extends ConvertToDeltaSuiteBase with org.apache.spark.sql.delta.test.DeltaSQLCommandTest - -trait ConvertToDeltaSuiteBase extends QueryTest +abstract class ConvertToDeltaSuiteBase extends QueryTest with SharedSparkSession { import org.apache.spark.sql.functions._ @@ -77,20 +74,7 @@ trait ConvertToDeltaSuiteBase extends QueryTest } } - protected def convertToDelta(identifier: String, partitionSchema: Option[String] = None): Unit = { - if (partitionSchema.isDefined) { - io.delta.tables.DeltaTable.convertToDelta( - spark, - identifier, - StructType.fromDDL(partitionSchema.get) - ) - } else { - io.delta.tables.DeltaTable.convertToDelta( - spark, - identifier - ) - } - } + protected def convertToDelta(identifier: String, partitionSchema: Option[String] = None): Unit test("negative case: convert a non-delta path falsely claimed as parquet") { Seq("orc", "json", "csv").foreach { format => diff --git a/src/test/scala/org/apache/spark/sql/delta/DeltaVacuumSuite.scala b/src/test/scala/org/apache/spark/sql/delta/DeltaVacuumSuite.scala index 490c31f12d2..88d66b5da0c 100644 --- a/src/test/scala/org/apache/spark/sql/delta/DeltaVacuumSuite.scala +++ b/src/test/scala/org/apache/spark/sql/delta/DeltaVacuumSuite.scala @@ -23,6 +23,7 @@ import java.util.concurrent.TimeUnit import org.apache.spark.sql.delta.DeltaOperations.{Delete, Write} import org.apache.spark.sql.delta.actions.{AddFile, Metadata, RemoveFile} import org.apache.spark.sql.delta.commands.VacuumCommand +import org.apache.spark.sql.delta.test.DeltaSQLCommandTest import org.apache.spark.sql.delta.util.DeltaFileOperations import org.apache.commons.io.FileUtils import org.apache.hadoop.fs.Path @@ -497,4 +498,4 @@ trait DeltaVacuumSuiteBase extends QueryTest } class DeltaVacuumSuite - extends DeltaVacuumSuiteBase with org.apache.spark.sql.delta.test.DeltaSQLCommandTest + extends DeltaVacuumSuiteBase with DeltaSQLCommandTest diff --git a/src/test/scala/org/apache/spark/sql/delta/DescribeDeltaDetailSuite.scala b/src/test/scala/org/apache/spark/sql/delta/DescribeDeltaDetailSuite.scala index 5e597c0171d..7722f523e8f 100644 --- a/src/test/scala/org/apache/spark/sql/delta/DescribeDeltaDetailSuite.scala +++ b/src/test/scala/org/apache/spark/sql/delta/DescribeDeltaDetailSuite.scala @@ -19,6 +19,8 @@ package org.apache.spark.sql.delta import java.io.File import java.io.FileNotFoundException +import org.apache.spark.sql.delta.test.DeltaSQLCommandTest + import org.apache.spark.sql.{DataFrame, QueryTest, Row} import org.apache.spark.sql.test.SharedSparkSession import org.apache.spark.util.Utils @@ -105,4 +107,4 @@ trait DescribeDeltaDetailSuiteBase extends QueryTest } class DescribeDeltaDetailSuite - extends DescribeDeltaDetailSuiteBase with org.apache.spark.sql.delta.test.DeltaSQLCommandTest + extends DescribeDeltaDetailSuiteBase with DeltaSQLCommandTest diff --git a/src/test/scala/org/apache/spark/sql/delta/DescribeDeltaHistorySuite.scala b/src/test/scala/org/apache/spark/sql/delta/DescribeDeltaHistorySuite.scala index 20a0367bfa3..df4987f3fda 100644 --- a/src/test/scala/org/apache/spark/sql/delta/DescribeDeltaHistorySuite.scala +++ b/src/test/scala/org/apache/spark/sql/delta/DescribeDeltaHistorySuite.scala @@ -18,6 +18,7 @@ package org.apache.spark.sql.delta import org.apache.spark.sql.delta.actions.CommitInfo import org.apache.spark.sql.delta.sources.DeltaSQLConf +import org.apache.spark.sql.delta.test.DeltaSQLCommandTest import org.scalatest.Tag import org.apache.spark.sql.{AnalysisException, Column, DataFrame, QueryTest, Row} @@ -279,5 +280,5 @@ trait DescribeDeltaHistorySuiteBase } class DescribeDeltaHistorySuite - extends DescribeDeltaHistorySuiteBase with org.apache.spark.sql.delta.test.DeltaSQLCommandTest + extends DescribeDeltaHistorySuiteBase with DeltaSQLCommandTest From 17ea0e7c5732b28060922d70ed80ea3f1666e7a7 Mon Sep 17 00:00:00 2001 From: Xiao Li Date: Wed, 27 Nov 2019 13:24:07 -0800 Subject: [PATCH 18/44] Add isPositiveDayTimeInterval to unify all internal config checks GitOrigin-RevId: dad5a32665fbf848f9c5c1844dedf8f842fd78a4 --- .../org/apache/spark/sql/delta/DeltaConfig.scala | 16 ++++++++++++---- .../org/apache/spark/sql/delta/DeltaLog.scala | 2 +- .../apache/spark/sql/delta/MetadataCleanup.scala | 6 ++++-- .../sql/delta/DeltaRetentionSuiteBase.scala | 2 +- .../spark/sql/delta/DeltaSourceSuite.scala | 4 ++-- .../spark/sql/delta/DeltaVacuumSuite.scala | 3 ++- 6 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/main/scala/org/apache/spark/sql/delta/DeltaConfig.scala b/src/main/scala/org/apache/spark/sql/delta/DeltaConfig.scala index b9f1a77251f..4c3c257622f 100644 --- a/src/main/scala/org/apache/spark/sql/delta/DeltaConfig.scala +++ b/src/main/scala/org/apache/spark/sql/delta/DeltaConfig.scala @@ -211,6 +211,14 @@ object DeltaConfigs extends DeltaLogging { } } + def getMilliSeconds(i: CalendarInterval): Long = { + i.milliseconds() + } + + private def isPositiveDayTimeInterval(i: CalendarInterval): Boolean = { + i.months == 0 && i.microseconds > 0 + } + /** * The shortest duration we have to keep delta files around before deleting them. We can only * delete delta files that are before a compaction. We may keep files beyond this duration until @@ -220,7 +228,7 @@ object DeltaConfigs extends DeltaLogging { "logRetentionDuration", "interval 30 days", parseCalendarInterval, - i => i.microseconds > 0 && i.months == 0, + isPositiveDayTimeInterval, "needs to be provided as a calendar interval such as '2 weeks'. Months " + "and years are not accepted. You may specify '365 days' for a year instead.") @@ -231,7 +239,7 @@ object DeltaConfigs extends DeltaLogging { "sampleRetentionDuration", "interval 7 days", parseCalendarInterval, - i => i.microseconds > 0 && i.months == 0, + isPositiveDayTimeInterval, "needs to be provided as a calendar interval such as '2 weeks'. Months " + "and years are not accepted. You may specify '365 days' for a year instead.") @@ -244,7 +252,7 @@ object DeltaConfigs extends DeltaLogging { "checkpointRetentionDuration", "interval 2 days", parseCalendarInterval, - i => i.microseconds > 0 && i.months == 0, + isPositiveDayTimeInterval, "needs to be provided as a calendar interval such as '2 weeks'. Months " + "and years are not accepted. You may specify '365 days' for a year instead.") @@ -294,7 +302,7 @@ object DeltaConfigs extends DeltaLogging { "deletedFileRetentionDuration", "interval 1 week", parseCalendarInterval, - i => i.microseconds > 0 && i.months == 0, + isPositiveDayTimeInterval, "needs to be provided as a calendar interval such as '2 weeks'. Months " + "and years are not accepted. You may specify '365 days' for a year instead.") diff --git a/src/main/scala/org/apache/spark/sql/delta/DeltaLog.scala b/src/main/scala/org/apache/spark/sql/delta/DeltaLog.scala index 8f47f07e2e9..0357a60abef 100644 --- a/src/main/scala/org/apache/spark/sql/delta/DeltaLog.scala +++ b/src/main/scala/org/apache/spark/sql/delta/DeltaLog.scala @@ -107,7 +107,7 @@ class DeltaLog private( /** How long to keep around logically deleted files before physically deleting them. */ private[delta] def tombstoneRetentionMillis: Long = - DeltaConfigs.TOMBSTONE_RETENTION.fromMetaData(metadata).milliseconds() + DeltaConfigs.getMilliSeconds(DeltaConfigs.TOMBSTONE_RETENTION.fromMetaData(metadata)) // TODO: There is a race here where files could get dropped when increasing the // retention interval... diff --git a/src/main/scala/org/apache/spark/sql/delta/MetadataCleanup.scala b/src/main/scala/org/apache/spark/sql/delta/MetadataCleanup.scala index 5a13c0bbcb6..4ef33909475 100644 --- a/src/main/scala/org/apache/spark/sql/delta/MetadataCleanup.scala +++ b/src/main/scala/org/apache/spark/sql/delta/MetadataCleanup.scala @@ -35,8 +35,10 @@ trait MetadataCleanup extends DeltaLogging { * Returns the duration in millis for how long to keep around obsolete logs. We may keep logs * beyond this duration until the next calendar day to avoid constantly creating checkpoints. */ - def deltaRetentionMillis: Long = - DeltaConfigs.LOG_RETENTION.fromMetaData(metadata).milliseconds() + def deltaRetentionMillis: Long = { + val interval = DeltaConfigs.LOG_RETENTION.fromMetaData(metadata) + DeltaConfigs.getMilliSeconds(interval) + } override def doLogCleanup(): Unit = { if (enableExpiredLogCleanup) { diff --git a/src/test/scala/org/apache/spark/sql/delta/DeltaRetentionSuiteBase.scala b/src/test/scala/org/apache/spark/sql/delta/DeltaRetentionSuiteBase.scala index 6c40e9361af..4a9a1ed680d 100644 --- a/src/test/scala/org/apache/spark/sql/delta/DeltaRetentionSuiteBase.scala +++ b/src/test/scala/org/apache/spark/sql/delta/DeltaRetentionSuiteBase.scala @@ -36,7 +36,7 @@ trait DeltaRetentionSuiteBase extends QueryTest .set("spark.databricks.delta.properties.defaults.enableExpiredLogCleanup", "false") protected def intervalStringToMillis(str: String): Long = { - CalendarInterval.fromString(str).milliseconds() + DeltaConfigs.getMilliSeconds(CalendarInterval.fromString(str)) } protected def getDeltaFiles(dir: File): Seq[File] = diff --git a/src/test/scala/org/apache/spark/sql/delta/DeltaSourceSuite.scala b/src/test/scala/org/apache/spark/sql/delta/DeltaSourceSuite.scala index d7d1c6aadfb..4f358e5501e 100644 --- a/src/test/scala/org/apache/spark/sql/delta/DeltaSourceSuite.scala +++ b/src/test/scala/org/apache/spark/sql/delta/DeltaSourceSuite.scala @@ -584,8 +584,8 @@ class DeltaSourceSuite extends DeltaSourceSuiteBase { CheckLastBatch("0", "1", "2"), Assert { clock.advance( - CalendarInterval.fromString( - DeltaConfigs.LOG_RETENTION.defaultValue).milliseconds() + 100000000L) + DeltaConfigs.getMilliSeconds(CalendarInterval.fromString( + DeltaConfigs.LOG_RETENTION.defaultValue)) + 100000000L) // Delete all logs before checkpoint writersLog.cleanUpExpiredLogs() diff --git a/src/test/scala/org/apache/spark/sql/delta/DeltaVacuumSuite.scala b/src/test/scala/org/apache/spark/sql/delta/DeltaVacuumSuite.scala index 88d66b5da0c..2cf8505ff16 100644 --- a/src/test/scala/org/apache/spark/sql/delta/DeltaVacuumSuite.scala +++ b/src/test/scala/org/apache/spark/sql/delta/DeltaVacuumSuite.scala @@ -293,7 +293,8 @@ trait DeltaVacuumSuiteBase extends QueryTest } protected def defaultTombstoneInterval: Long = { - CalendarInterval.fromString(DeltaConfigs.TOMBSTONE_RETENTION.defaultValue).milliseconds() + DeltaConfigs.getMilliSeconds(CalendarInterval.fromString( + DeltaConfigs.TOMBSTONE_RETENTION.defaultValue)) } implicit def fileToPathString(f: File): String = new Path(f.getAbsolutePath).toString From 1d698ba2419caadc5ea9b4eeab99140822b42022 Mon Sep 17 00:00:00 2001 From: Rahul Mahadev Date: Wed, 4 Dec 2019 00:59:06 +0000 Subject: [PATCH 19/44] [SC-26331][DELTA] Exporting InvariantEnforcementSuite, SchemaUtilsSuite and CaseSensitivitySuite to OSS ## What changes were proposed in this pull request? This change proposes to export `InvariantEnforcementSuite`, `SchemaUtilsSuite` and `CaseSensitivitySuite` to OSS Delta. ## How was this patch tested? Ran `InvariantEnforcementSuite`,`SchemaUtilsSuite` and `CaseSensitivitySuite` locally Author: Rahul Mahadev #7137 is resolved by rahulsmahadev/invariantEnforcementOSS. GitOrigin-RevId: d723fbf25e4406cb35bb513a78e32485b5b99c7e --- .../delta/schema/CaseSensitivitySuite.scala | 215 +++ .../schema/InvariantEnforcementSuite.scala | 424 ++++++ .../sql/delta/schema/SchemaUtilsSuite.scala | 1178 +++++++++++++++++ 3 files changed, 1817 insertions(+) create mode 100644 src/test/scala/org/apache/spark/sql/delta/schema/CaseSensitivitySuite.scala create mode 100644 src/test/scala/org/apache/spark/sql/delta/schema/InvariantEnforcementSuite.scala create mode 100644 src/test/scala/org/apache/spark/sql/delta/schema/SchemaUtilsSuite.scala diff --git a/src/test/scala/org/apache/spark/sql/delta/schema/CaseSensitivitySuite.scala b/src/test/scala/org/apache/spark/sql/delta/schema/CaseSensitivitySuite.scala new file mode 100644 index 00000000000..a0e34a11fa1 --- /dev/null +++ b/src/test/scala/org/apache/spark/sql/delta/schema/CaseSensitivitySuite.scala @@ -0,0 +1,215 @@ +/* + * Copyright 2019 Databricks, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.spark.sql.delta.schema + +import java.io.File + +import org.apache.spark.sql.delta.DeltaLog +import org.apache.spark.sql.delta.actions.AddFile + +import org.apache.spark.sql._ +import org.apache.spark.sql.execution.streaming.MemoryStream +import org.apache.spark.sql.functions.col +import org.apache.spark.sql.internal.SQLConf +import org.apache.spark.sql.streaming.{StreamingQuery, StreamingQueryException} +import org.apache.spark.sql.test.{SharedSparkSession, SQLTestUtils} + +class CaseSensitivitySuite extends QueryTest + with SharedSparkSession with SQLTestUtils { + + import testImplicits._ + + private def testWithCaseSensitivity(name: String)(f: => Unit): Unit = { + testQuietly(name) { + withSQLConf(SQLConf.CASE_SENSITIVE.key -> "true") { + f + } + + withSQLConf(SQLConf.CASE_SENSITIVE.key -> "false") { + f + } + } + } + + private def getPartitionValues(allFiles: Dataset[AddFile], colName: String): Array[String] = { + allFiles.select(col(s"partitionValues.$colName")).where(col(colName).isNotNull) + .distinct().as[String].collect() + } + + testWithCaseSensitivity("case sensitivity of partition fields") { + withTempDir { tempDir => + val query = "SELECT id + 1 as Foo, id as Bar FROM RANGE(1)" + sql(query).write.partitionBy("foo").format("delta").save(tempDir.getAbsolutePath) + checkAnswer( + sql(query), + spark.read.format("delta").load(tempDir.getAbsolutePath) + ) + + val allFiles = DeltaLog.forTable(spark, tempDir.getAbsolutePath).snapshot.allFiles + assert(getPartitionValues(allFiles, "Foo") === Array("1")) + checkAnswer( + spark.read.format("delta").load(tempDir.getAbsolutePath), + Row(1L, 0L) + ) + } + } + + testQuietly("case sensitivity of partition fields (stream)") { + // DataStreamWriter auto normalizes partition columns, therefore we don't need to check + // case sensitive case + withSQLConf(SQLConf.CASE_SENSITIVE.key -> "false") { + withTempDir { tempDir => + val memSource = MemoryStream[(Long, Long)] + val stream1 = startStream(memSource.toDF().toDF("Foo", "Bar"), tempDir) + try { + memSource.addData((1L, 0L)) + stream1.processAllAvailable() + } finally { + stream1.stop() + } + + checkAnswer( + spark.read.format("delta").load(tempDir.getAbsolutePath), + Row(1L, 0L) + ) + + val allFiles = DeltaLog.forTable(spark, tempDir.getAbsolutePath).snapshot.allFiles + assert(getPartitionValues(allFiles, "Foo") === Array("1")) + } + } + } + + testWithCaseSensitivity("two fields with same name") { + withTempDir { tempDir => + intercept[AnalysisException] { + val query = "SELECT id as Foo, id as foo FROM RANGE(1)" + sql(query).write.partitionBy("foo").format("delta").save(tempDir.getAbsolutePath) + } + } + } + + testWithCaseSensitivity("two fields with same name (stream)") { + withTempDir { tempDir => + val memSource = MemoryStream[(Long, Long)] + val stream1 = startStream(memSource.toDF().toDF("Foo", "foo"), tempDir) + try { + val e = intercept[StreamingQueryException] { + memSource.addData((0L, 0L)) + stream1.processAllAvailable() + } + assert(e.cause.isInstanceOf[AnalysisException]) + } finally { + stream1.stop() + } + } + } + + testWithCaseSensitivity("schema merging is case insenstive but preserves original case") { + withTempDir { tempDir => + val query1 = "SELECT id as foo, id as bar FROM RANGE(1)" + sql(query1).write.format("delta").save(tempDir.getAbsolutePath) + + val query2 = "SELECT id + 1 as Foo, id as bar FROM RANGE(1)" // notice how 'F' is capitalized + sql(query2).write.format("delta").mode("append").save(tempDir.getAbsolutePath) + + val query3 = "SELECT id as bAr, id + 2 as Foo FROM RANGE(1)" // changed order as well + sql(query3).write.format("delta").mode("append").save(tempDir.getAbsolutePath) + + val df = spark.read.format("delta").load(tempDir.getAbsolutePath) + checkAnswer( + df, + Row(0, 0) :: Row(1, 0) :: Row(2, 0) :: Nil + ) + assert(df.schema.fieldNames === Seq("foo", "bar")) + } + } + + testWithCaseSensitivity("schema merging preserving column case (stream)") { + withTempDir { tempDir => + val memSource = MemoryStream[(Long, Long)] + val stream1 = startStream(memSource.toDF().toDF("Foo", "Bar"), tempDir, None) + try { + memSource.addData((0L, 0L)) + stream1.processAllAvailable() + } finally { + stream1.stop() + } + val stream2 = startStream(memSource.toDF().toDF("foo", "Bar"), tempDir, None) + try { + memSource.addData((1L, 2L)) + stream2.processAllAvailable() + } finally { + stream2.stop() + } + + val df = spark.read.format("delta").load(tempDir.getAbsolutePath) + checkAnswer( + df, + Row(0L, 0L) :: Row(1L, 2L) :: Nil + ) + assert(df.schema.fieldNames === Seq("Foo", "Bar")) + } + } + + test("SC-12677: replaceWhere predicate should be case insensitive") { + withTempDir { tempDir => + val path = tempDir.getCanonicalPath + Seq((1, "a"), (2, "b")).toDF("Key", "val").write + .partitionBy("key").format("delta").mode("append").save(path) + + withSQLConf(SQLConf.CASE_SENSITIVE.key -> "false") { + Seq((2, "c")).toDF("Key", "val").write + .format("delta") + .mode("overwrite") + .option("replaceWhere", "key = 2") // note the different case + .save(path) + } + + checkAnswer( + spark.read.format("delta").load(path), + Row(1, "a") :: Row(2, "c") :: Nil + ) + + withSQLConf(SQLConf.CASE_SENSITIVE.key -> "true") { + val e = intercept[AnalysisException] { + Seq((2, "d")).toDF("Key", "val").write + .format("delta") + .mode("overwrite") + .option("replaceWhere", "key = 2") // note the different case + .save(path) + } + assert(e.getMessage.contains("Key")) + } + + checkAnswer( + spark.read.format("delta").load(path), + Row(1, "a") :: Row(2, "c") :: Nil + ) + } + } + + private def startStream( + df: Dataset[_], + tempDir: File, + partitionBy: Option[String] = Some("foo")): StreamingQuery = { + val writer = df.writeStream + .option("checkpointLocation", new File(tempDir, "_checkpoint").getAbsolutePath) + .format("delta") + partitionBy.foreach(writer.partitionBy(_)) + writer.start(tempDir.getAbsolutePath) + } +} diff --git a/src/test/scala/org/apache/spark/sql/delta/schema/InvariantEnforcementSuite.scala b/src/test/scala/org/apache/spark/sql/delta/schema/InvariantEnforcementSuite.scala new file mode 100644 index 00000000000..ddfdf015a8d --- /dev/null +++ b/src/test/scala/org/apache/spark/sql/delta/schema/InvariantEnforcementSuite.scala @@ -0,0 +1,424 @@ +/* + * Copyright 2019 Databricks, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.spark.sql.delta.schema + +import java.io.File + +import scala.collection.JavaConverters._ + +import org.apache.spark.sql.delta.{DeltaLog, DeltaOperations} +import org.apache.spark.sql.delta.actions.Metadata +import org.apache.spark.sql.delta.schema.Invariants.{ArbitraryExpression, NotNull, PersistedExpression} + +import org.apache.spark.SparkException +import org.apache.spark.sql._ +import org.apache.spark.sql.execution.streaming.MemoryStream +import org.apache.spark.sql.streaming.StreamingQueryException +import org.apache.spark.sql.test.{SharedSparkSession, SQLTestUtils} +import org.apache.spark.sql.types._ + +class InvariantEnforcementSuite extends QueryTest + with SharedSparkSession with SQLTestUtils { + + import testImplicits._ + + private def tableWithSchema(schema: StructType)(f: String => Unit): Unit = { + withTempDir { tempDir => + val deltaLog = DeltaLog.forTable(spark, tempDir) + val txn = deltaLog.startTransaction() + txn.commit(Metadata(schemaString = schema.json) :: Nil, DeltaOperations.ManualUpdate) + spark.read.format("delta") + .load(tempDir.getAbsolutePath) + .write + .format("delta") + .mode("overwrite") + .save(tempDir.getAbsolutePath) + f(tempDir.getAbsolutePath) + } + } + + private def testBatchWriteRejection( + invariant: Invariants.Rule, + schema: StructType, + df: Dataset[_], + expectedErrors: String*): Unit = { + tableWithSchema(schema) { path => + val e = intercept[SparkException] { + df.write.mode("append").format("delta").save(path) + } + var violationException = e.getCause + while (violationException != null && + !violationException.isInstanceOf[InvariantViolationException]) { + violationException = violationException.getCause + } + if (violationException == null) { + fail("Didn't receive a InvariantViolationException.") + } + assert(violationException.isInstanceOf[InvariantViolationException]) + val error = violationException.getMessage + val allExpected = Seq(invariant.name) ++ expectedErrors + allExpected.foreach { expected => + assert(error.contains(expected), s"$error didn't contain $expected") + } + } + } + + private def testStreamingWriteRejection[T: Encoder]( + invariant: Invariants.Rule, + schema: StructType, + toDF: MemoryStream[T] => DataFrame, + data: Seq[T], + expectedErrors: String*): Unit = { + withTempDir { dir => + val deltaLog = DeltaLog.forTable(spark, dir) + val txn = deltaLog.startTransaction() + txn.commit(Metadata(schemaString = schema.json) :: Nil, DeltaOperations.ManualUpdate) + val memStream = MemoryStream[T] + val stream = toDF(memStream).writeStream + .outputMode("append") + .format("delta") + .option("checkpointLocation", new File(dir, "_checkpoint").getAbsolutePath) + .start(dir.getAbsolutePath) + try { + val e = intercept[StreamingQueryException] { + memStream.addData(data) + stream.processAllAvailable() + } + var violationException = e.getCause + while (violationException != null && + !violationException.isInstanceOf[InvariantViolationException]) { + violationException = violationException.getCause + } + if (violationException == null) { + fail("Didn't receive a InvariantViolationException.") + } + assert(violationException.isInstanceOf[InvariantViolationException]) + val error = violationException.getMessage + assert((Seq(invariant.name) ++ expectedErrors).forall(error.contains)) + } finally { + stream.stop() + } + } + } + + private def testStreamingWrite[T: Encoder]( + schema: StructType, + toDF: MemoryStream[T] => DataFrame, + data: Seq[T], + expected: DataFrame): Unit = { + withTempDir { dir => + val deltaLog = DeltaLog.forTable(spark, dir) + val txn = deltaLog.startTransaction() + txn.commit(Metadata(schemaString = schema.json) :: Nil, DeltaOperations.ManualUpdate) + val memStream = MemoryStream[T] + val stream = toDF(memStream).writeStream + .outputMode("append") + .format("delta") + .option("checkpointLocation", new File(dir, "_checkpoint").getAbsolutePath) + .start(dir.getAbsolutePath) + try { + memStream.addData(data) + stream.processAllAvailable() + + checkAnswer( + spark.read.format("delta").load(dir.getAbsolutePath), + expected + ) + } finally { + stream.stop() + } + } + } + + testQuietly("reject non-nullable top level column") { + val schema = new StructType() + .add("key", StringType, nullable = false) + .add("value", IntegerType) + testBatchWriteRejection( + NotNull, + schema, + Seq[(String, Int)](("a", 1), (null, 2)).toDF("key", "value"), + "key" + ) + testStreamingWriteRejection[(String, Int)]( + NotNull, + schema, + _.toDF().toDF("key", "value"), + Seq[(String, Int)](("a", 1), (null, 2)), + "key" + ) + } + + testQuietly("reject non-nullable top level column - column doesn't exist") { + val schema = new StructType() + .add("key", StringType, nullable = false) + .add("value", IntegerType) + testBatchWriteRejection( + NotNull, + schema, + Seq[Int](1, 2).toDF("value"), + "key" + ) + testStreamingWriteRejection[Int]( + NotNull, + schema, + _.toDF().toDF("value"), + Seq[Int](1, 2), + "key" + ) + } + + testQuietly("write empty DataFrame - zero rows") { + val schema = new StructType() + .add("key", StringType, nullable = false) + .add("value", IntegerType) + tableWithSchema(schema) { path => + spark.createDataFrame(Seq.empty[Row].asJava, schema.asNullable).write + .mode("append").format("delta").save(path) + } + } + + testQuietly("write empty DataFrame - zero columns") { + val schema = new StructType() + .add("key", StringType, nullable = false) + .add("value", IntegerType) + testBatchWriteRejection( + NotNull, + schema, + Seq[Int](1, 2).toDF("value").drop("value"), + "key" + ) + testStreamingWriteRejection[Int]( + NotNull, + schema, + _.toDF().toDF("value").drop("value"), + Seq[Int](1, 2), + "key" + ) + } + + testQuietly("reject non-nullable nested column") { + val schema = new StructType() + .add("top", new StructType() + .add("key", StringType, nullable = false) + .add("value", IntegerType)) + testBatchWriteRejection( + NotNull, + schema, + spark.createDataFrame(Seq(Row(Row("a", 1)), Row(Row(null, 2))).asJava, schema.asNullable), + "top.key" + ) + testBatchWriteRejection( + NotNull, + schema, + spark.createDataFrame(Seq(Row(Row("a", 1)), Row(null)).asJava, schema.asNullable), + "top.key" + ) + } + + testQuietly("complex type - children of array type can't be checked") { + val schema = new StructType() + .add("top", ArrayType(ArrayType(new StructType() + .add("key", StringType, nullable = false) + .add("value", IntegerType)))) + tableWithSchema(schema) { path => + spark.createDataFrame(Seq(Row(Seq(Seq(Row("a", 1)))), Row(Seq(Seq(Row(null, 2))))).asJava, + schema.asNullable).write.mode("append").format("delta").save(path) + spark.createDataFrame(Seq(Row(Seq(Seq(Row("a", 1)))), Row(null)).asJava, schema.asNullable) + .write.mode("append").format("delta").save(path) + } + } + + testQuietly("reject non-nullable array column") { + val schema = new StructType() + .add("top", ArrayType(ArrayType(new StructType() + .add("key", StringType) + .add("value", IntegerType))), nullable = false) + testBatchWriteRejection( + NotNull, + schema, + spark.createDataFrame(Seq(Row(Seq(Seq(Row("a", 1)))), Row(null)).asJava, schema.asNullable), + "top" + ) + } + + testQuietly("reject expression invariant on top level column") { + val expr = "value < 3" + val rule = ArbitraryExpression(spark, expr) + val metadata = new MetadataBuilder() + .putString(Invariants.INVARIANTS_FIELD, PersistedExpression(expr).json) + .build() + val schema = new StructType() + .add("key", StringType) + .add("value", IntegerType, nullable = true, metadata) + testBatchWriteRejection( + rule, + schema, + Seq[(String, Int)](("a", 1), (null, 5)).toDF("key", "value"), + "value", "5" + ) + testStreamingWriteRejection[(String, Int)]( + rule, + schema, + _.toDF().toDF("key", "value"), + Seq[(String, Int)](("a", 1), (null, 5)), + "value" + ) + } + + testQuietly("reject expression invariant on nested column") { + val expr = "top.key < 3" + val rule = ArbitraryExpression(spark, expr) + val metadata = new MetadataBuilder() + .putString(Invariants.INVARIANTS_FIELD, PersistedExpression(expr).json) + .build() + val schema = new StructType() + .add("top", new StructType() + .add("key", StringType) + .add("value", IntegerType, nullable = true, metadata)) + testBatchWriteRejection( + rule, + schema, + spark.createDataFrame(Seq(Row(Row("a", 1)), Row(Row(null, 5))).asJava, schema.asNullable), + "top.key", "5" + ) + } + + testQuietly("reject write on top level expression invariant when field is null") { + val expr = "value < 3" + val metadata = new MetadataBuilder() + .putString(Invariants.INVARIANTS_FIELD, PersistedExpression(expr).json) + .build() + val rule = ArbitraryExpression(spark, expr) + val schema = new StructType() + .add("key", StringType) + .add("value", IntegerType, nullable = true, metadata) + testBatchWriteRejection( + rule, + schema, + Seq[String]("a", "b").toDF("key"), + "value", "null" + ) + testBatchWriteRejection( + rule, + schema, + Seq[(String, Integer)](("a", 1), ("b", null)).toDF("key", "value"), + "value", "null" + ) + } + + testQuietly("reject write on nested expression invariant when field is null") { + val expr = "top.value < 3" + val metadata = new MetadataBuilder() + .putString(Invariants.INVARIANTS_FIELD, PersistedExpression(expr).json) + .build() + val rule = ArbitraryExpression(spark, expr) + val schema = new StructType() + .add("top", new StructType() + .add("key", StringType) + .add("value", IntegerType, nullable = true, metadata)) + testBatchWriteRejection( + rule, + schema, + spark.createDataFrame(Seq(Row(Row("a", 1)), Row(Row("b", null))).asJava, schema.asNullable), + "top.value", "null" + ) + val schema2 = new StructType() + .add("top", new StructType() + .add("key", StringType)) + testBatchWriteRejection( + rule, + schema, + spark.createDataFrame(Seq(Row(Row("a")), Row(Row("b"))).asJava, schema2.asNullable), + "top.value", "null" + ) + } + + testQuietly("is null on top level expression invariant when field is null") { + val expr = "value is null or value < 3" + val metadata = new MetadataBuilder() + .putString(Invariants.INVARIANTS_FIELD, PersistedExpression(expr).json) + .build() + val schema = new StructType() + .add("key", StringType) + .add("value", IntegerType, nullable = true, metadata) + tableWithSchema(schema) { path => + Seq[String]("a", "b").toDF("key").write + .mode("append").format("delta").save(path) + Seq[(String, Integer)](("a", 1), ("b", null)).toDF("key", "value").write + .mode("append").format("delta").save(path) + } + } + + testQuietly("is null on nested expression invariant when field is null") { + val expr = "top.value is null or top.value < 3" + val metadata = new MetadataBuilder() + .putString(Invariants.INVARIANTS_FIELD, PersistedExpression(expr).json) + .build() + val schema = new StructType() + .add("top", new StructType() + .add("key", StringType) + .add("value", IntegerType, nullable = true, metadata)) + val schema2 = new StructType() + .add("top", new StructType() + .add("key", StringType)) + tableWithSchema(schema) { path => + spark.createDataFrame(Seq(Row(Row("a", 1)), Row(Row("b", null))).asJava, schema.asNullable) + .write.mode("append").format("delta").save(path) + spark.createDataFrame(Seq(Row(Row("a")), Row(Row("b"))).asJava, schema2.asNullable) + .write.mode("append").format("delta").save(path) + } + } + + testQuietly("complex expressions - AND") { + val expr = "value < 3 AND value > 0" + val metadata = new MetadataBuilder() + .putString(Invariants.INVARIANTS_FIELD, PersistedExpression(expr).json) + .build() + val schema = new StructType() + .add("key", StringType) + .add("value", IntegerType, nullable = true, metadata) + tableWithSchema(schema) { path => + Seq(1, 2).toDF("value").write.mode("append").format("delta").save(path) + intercept[SparkException] { + Seq(1, 4).toDF("value").write.mode("append").format("delta").save(path) + } + intercept[SparkException] { + Seq(-1, 2).toDF("value").write.mode("append").format("delta").save(path) + } + } + } + + testQuietly("complex expressions - IN SET") { + val expr = "key in ('a', 'b', 'c')" + val metadata = new MetadataBuilder() + .putString(Invariants.INVARIANTS_FIELD, PersistedExpression(expr).json) + .build() + val schema = new StructType() + .add("key", StringType, nullable = true, metadata) + .add("value", IntegerType) + tableWithSchema(schema) { tempDir => + Seq("a", "b").toDF("key").write.mode("append").format("delta").save(tempDir) + intercept[SparkException] { + Seq("a", "d").toDF("key").write.mode("append").format("delta").save(tempDir) + } + intercept[SparkException] { + Seq("e").toDF("key").write.mode("append").format("delta").save(tempDir) + } + } + } +} diff --git a/src/test/scala/org/apache/spark/sql/delta/schema/SchemaUtilsSuite.scala b/src/test/scala/org/apache/spark/sql/delta/schema/SchemaUtilsSuite.scala new file mode 100644 index 00000000000..64b4aa6a101 --- /dev/null +++ b/src/test/scala/org/apache/spark/sql/delta/schema/SchemaUtilsSuite.scala @@ -0,0 +1,1178 @@ +/* + * Copyright 2019 Databricks, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.spark.sql.delta.schema + +import java.util.Locale + + +import org.apache.spark.sql.{AnalysisException, QueryTest, Row} +import org.apache.spark.sql.internal.SQLConf +import org.apache.spark.sql.test.{SharedSparkSession, SQLTestUtils} +import org.apache.spark.sql.types._ + +class SchemaUtilsSuite extends QueryTest + with SharedSparkSession + with SQLTestUtils { + import SchemaUtils._ + import testImplicits._ + + private def expectFailure(shouldContain: String*)(f: => Unit): Unit = { + val e = intercept[AnalysisException] { + f + } + val msg = e.getMessage.toLowerCase(Locale.ROOT) + assert(shouldContain.map(_.toLowerCase(Locale.ROOT)).forall(msg.contains), + s"Error message '$msg' didn't contain: $shouldContain") + } + + ///////////////////////////// + // Duplicate Column Checks + ///////////////////////////// + + test("duplicate column name in top level") { + val schema = new StructType() + .add("dupColName", IntegerType) + .add("b", IntegerType) + .add("dupColName", StringType) + expectFailure("dupColName") { checkColumnNameDuplication(schema, "") } + } + + test("duplicate column name in top level - case sensitivity") { + val schema = new StructType() + .add("dupColName", IntegerType) + .add("b", IntegerType) + .add("dupCOLNAME", StringType) + expectFailure("dupColName") { checkColumnNameDuplication(schema, "") } + } + + test("duplicate column name for nested column + non-nested column") { + val schema = new StructType() + .add("dupColName", new StructType() + .add("a", IntegerType) + .add("b", IntegerType)) + .add("dupColName", IntegerType) + expectFailure("dupColName") { checkColumnNameDuplication(schema, "") } + } + + test("duplicate column name for nested column + non-nested column - case sensitivity") { + val schema = new StructType() + .add("dupColName", new StructType() + .add("a", IntegerType) + .add("b", IntegerType)) + .add("dupCOLNAME", IntegerType) + expectFailure("dupCOLNAME") { checkColumnNameDuplication(schema, "") } + } + + test("duplicate column name in nested level") { + val schema = new StructType() + .add("top", new StructType() + .add("dupColName", IntegerType) + .add("b", IntegerType) + .add("dupColName", StringType) + ) + expectFailure("top.dupColName") { checkColumnNameDuplication(schema, "") } + } + + test("duplicate column name in nested level - case sensitivity") { + val schema = new StructType() + .add("top", new StructType() + .add("dupColName", IntegerType) + .add("b", IntegerType) + .add("dupCOLNAME", StringType) + ) + expectFailure("top.dupColName") { checkColumnNameDuplication(schema, "") } + } + + test("duplicate column name in double nested level") { + val schema = new StructType() + .add("top", new StructType() + .add("b", new StructType() + .add("dupColName", StringType) + .add("c", IntegerType) + .add("dupColName", StringType)) + .add("d", IntegerType) + ) + expectFailure("top.b.dupColName") { checkColumnNameDuplication(schema, "") } + } + + test("duplicate column name in double nested array") { + val schema = new StructType() + .add("top", new StructType() + .add("b", ArrayType(ArrayType(new StructType() + .add("dupColName", StringType) + .add("c", IntegerType) + .add("dupColName", StringType)))) + .add("d", IntegerType) + ) + expectFailure("top.b.dupColName") { checkColumnNameDuplication(schema, "") } + } + + test("duplicate column name in double nested map") { + val keyType = new StructType() + .add("dupColName", IntegerType) + .add("d", StringType) + expectFailure("top.b.key.dupColName") { + val schema = new StructType() + .add("top", new StructType() + .add("b", MapType(keyType.add("dupColName", StringType), keyType)) + ) + checkColumnNameDuplication(schema, "") + } + expectFailure("top.b.value.dupColName") { + val schema = new StructType() + .add("top", new StructType() + .add("b", MapType(keyType, keyType.add("dupColName", StringType))) + ) + checkColumnNameDuplication(schema, "") + } + // This is okay + val schema = new StructType() + .add("top", new StructType() + .add("b", MapType(keyType, keyType)) + ) + checkColumnNameDuplication(schema, "") + } + + test("duplicate column name in nested array") { + val schema = new StructType() + .add("top", ArrayType(new StructType() + .add("dupColName", IntegerType) + .add("b", IntegerType) + .add("dupColName", StringType)) + ) + expectFailure("top.dupColName") { checkColumnNameDuplication(schema, "") } + } + + test("duplicate column name in nested array - case sensitivity") { + val schema = new StructType() + .add("top", ArrayType(new StructType() + .add("dupColName", IntegerType) + .add("b", IntegerType) + .add("dupCOLNAME", StringType)) + ) + expectFailure("top.dupColName") { checkColumnNameDuplication(schema, "") } + } + + test("non duplicate column because of back tick") { + val schema = new StructType() + .add("top", new StructType() + .add("a", IntegerType) + .add("b", IntegerType)) + .add("top.a", IntegerType) + checkColumnNameDuplication(schema, "") + } + + test("non duplicate column because of back tick - nested") { + val schema = new StructType() + .add("first", new StructType() + .add("top", new StructType() + .add("a", IntegerType) + .add("b", IntegerType)) + .add("top.a", IntegerType)) + checkColumnNameDuplication(schema, "") + } + + test("duplicate column with back ticks - nested") { + val schema = new StructType() + .add("first", new StructType() + .add("top.a", StringType) + .add("b", IntegerType) + .add("top.a", IntegerType)) + expectFailure("first.`top.a`") { checkColumnNameDuplication(schema, "") } + } + + test("duplicate column with back ticks - nested and case sensitivity") { + val schema = new StructType() + .add("first", new StructType() + .add("TOP.a", StringType) + .add("b", IntegerType) + .add("top.a", IntegerType)) + expectFailure("first.`top.a`") { checkColumnNameDuplication(schema, "") } + } + + ///////////////////////////// + // Read Compatibility Checks + ///////////////////////////// + + /** + * Tests change of datatype within a schema. + * - the make() function is a "factory" function to create schemas that vary only by the + * given datatype in a specific position in the schema. + * - other tests will call this method with different make() functions to test datatype + * incompatibility in all the different places within a schema (in a top-level struct, + * in a nested struct, as the element type of an array, etc.) + */ + def testDatatypeChange(scenario: String)(make: DataType => StructType): Unit = { + val schemas = Map( + ("int", make(IntegerType)), + ("string", make(StringType)), + ("struct", make(new StructType().add("a", StringType))), + ("array", make(ArrayType(IntegerType))), + ("map", make(MapType(StringType, FloatType))) + ) + test(s"change of datatype should fail read compatibility - $scenario") { + for (a <- schemas.keys; b <- schemas.keys if a != b) { + assert(!isReadCompatible(schemas(a), schemas(b)), + s"isReadCompatible should have failed for: ${schemas(a)}, ${schemas(b)}") + } + } + } + + /** + * Tests change of nullability within a schema (making a field nullable is not allowed, + * but making a nullable field non-nullable is ok). + * - the make() function is a "factory" function to create schemas that vary only by the + * nullability (of a field, array elemnt, or map values) in a specific position in the schema. + * - other tests will call this method with different make() functions to test nullability + * incompatibility in all the different places within a schema (in a top-level struct, + * in a nested struct, for the element type of an array, etc.) + */ + def testNullability (scenario: String)(make: Boolean => StructType): Unit = { + val nullable = make(true) + val nonNullable = make(false) + test(s"relaxed nullability should fail read compatibility - $scenario") { + assert(!isReadCompatible(nonNullable, nullable)) + } + test(s"restricted nullability should not fail read compatibility - $scenario") { + assert(isReadCompatible(nullable, nonNullable)) + } + } + + /** + * Tests for fields of a struct: adding/dropping fields, changing nullability, case variation + * - The make() function is a "factory" method to produce schemas. It takes a function that + * mutates a struct (for example, but adding a column, or it could just not make any change). + * - Following tests will call this method with different factory methods, to mutate the + * various places where a struct can appear (at the top-level, nested in another struct, + * within an array, etc.) + * - This allows us to have one shared code to test compatibility of a struct field in all the + * different places where it may occur. + */ + def testColumnVariations(scenario: String) + (make: (StructType => StructType) => StructType): Unit = { + + // generate one schema without extra column, one with, one nullable, and one with mixed case + val withoutExtra = make(struct => struct) // produce struct WITHOUT extra field + val withExtraNullable = make(struct => struct.add("extra", StringType)) + val withExtraMixedCase = make(struct => struct.add("eXtRa", StringType)) + val withExtraNonNullable = make(struct => struct.add("extra", StringType, nullable = false)) + + test(s"dropping a field should fail read compatibility - $scenario") { + assert(!isReadCompatible(withExtraNullable, withoutExtra)) + } + test(s"adding a nullable field should not fail read compatibility - $scenario") { + assert(isReadCompatible(withoutExtra, withExtraNullable)) + } + test(s"adding a non-nullable field should not fail read compatibility - $scenario") { + assert(isReadCompatible(withoutExtra, withExtraNonNullable)) + } + test(s"case variation of field name should fail read compatibility - $scenario") { + assert(!isReadCompatible(withExtraNullable, withExtraMixedCase)) + } + testNullability(scenario)(b => make(struct => struct.add("extra", StringType, nullable = b))) + testDatatypeChange(scenario)(datatype => make(struct => struct.add("extra", datatype))) + } + + // -------------------------------------------------------------------- + // tests for all kinds of places where a field can appear in a struct + // -------------------------------------------------------------------- + + testColumnVariations("top level")( + f => f(new StructType().add("a", IntegerType))) + + testColumnVariations("nested struct")( + f => new StructType() + .add("a", f(new StructType().add("b", IntegerType)))) + + testColumnVariations("nested in array")( + f => new StructType() + .add("array", ArrayType( + f(new StructType().add("b", IntegerType))))) + + testColumnVariations("nested in map key")( + f => new StructType() + .add("map", MapType( + f(new StructType().add("b", IntegerType)), + StringType))) + + testColumnVariations("nested in map value")( + f => new StructType() + .add("map", MapType( + StringType, + f(new StructType().add("b", IntegerType))))) + + // -------------------------------------------------------------------- + // tests for data type change in places other than struct + // -------------------------------------------------------------------- + + testDatatypeChange("array element")( + datatype => new StructType() + .add("array", ArrayType(datatype))) + + testDatatypeChange("map key")( + datatype => new StructType() + .add("map", MapType(datatype, StringType))) + + testDatatypeChange("map value")( + datatype => new StructType() + .add("map", MapType(StringType, datatype))) + + // -------------------------------------------------------------------- + // tests for nullability change in places other than struct + // -------------------------------------------------------------------- + + testNullability("array contains null")( + b => new StructType() + .add("array", ArrayType(StringType, containsNull = b))) + + testNullability("map contains null values")( + b => new StructType() + .add("map", MapType(IntegerType, StringType, valueContainsNull = b))) + + testNullability("map nested in array")( + b => new StructType() + .add("map", ArrayType( + MapType(IntegerType, StringType, valueContainsNull = b)))) + + testNullability("array nested in map")( + b => new StructType() + .add("map", MapType( + IntegerType, + ArrayType(StringType, containsNull = b)))) + + //////////////////////////// + // reportDifference + //////////////////////////// + + /** + * @param existing the existing schema to compare to + * @param specified the new specified schema + * @param expected an expected list of messages, each describing a schema difference. + * Every expected message is actually a regex patterns that is matched + * against all diffs that are returned. This is necessary to tolerate + * variance in ordering of field names, for example in a message such as + * "Specified schema has additional field(s): x, y", we cannot predict + * the order of x and y. + */ + def testReportDifferences(testName: String) + (existing: StructType, specified: StructType, expected: String*): Unit = { + test(testName) { + val differences = SchemaUtils.reportDifferences(existing, specified) + // make sure every expected difference is reported + expected foreach ((exp: String) => + assert(differences.exists(message => exp.r.findFirstMatchIn(message).isDefined), + s"""Difference not reported. + |Expected: + |- $exp + |Reported: ${differences.mkString("\n- ", "\n- ", "")} + """.stripMargin)) + // make sure there are no extra differences reported + assert(expected.size == differences.size, + s"""Too many differences reported. + |Expected: ${expected.mkString("\n- ", "\n- ", "")} + |Reported: ${differences.mkString("\n- ", "\n- ", "")} + """.stripMargin) + } + } + + testReportDifferences("extra columns should be reported as a difference")( + existing = new StructType() + .add("a", IntegerType), + specified = new StructType() + .add("a", IntegerType) + .add("b", StringType), + expected = "additional field[(]s[)]: b" + ) + + testReportDifferences("missing columns should be reported as a difference")( + existing = new StructType() + .add("a", IntegerType) + .add("b", StringType), + specified = new StructType() + .add("a", IntegerType), + expected = "missing field[(]s[)]: b" + ) + + testReportDifferences("making a column nullable should be reported as a difference")( + existing = new StructType() + .add("a", IntegerType, nullable = false) + .add("b", StringType, nullable = true), + specified = new StructType() + .add("a", IntegerType, nullable = true) + .add("b", StringType, nullable = true), + expected = "a is nullable in specified schema but non-nullable in existing schema" + ) + + testReportDifferences("making a column non-nullable should be reported as a difference")( + existing = new StructType() + .add("a", IntegerType, nullable = false) + .add("b", StringType, nullable = true), + specified = new StructType() + .add("a", IntegerType, nullable = false) + .add("b", StringType, nullable = false), + expected = "b is non-nullable in specified schema but nullable in existing schema" + ) + + testReportDifferences("change in column metadata should be reported as a difference")( + existing = new StructType() + .add("a", IntegerType, nullable = true, new MetadataBuilder().putString("x", "1").build()) + .add("b", StringType), + specified = new StructType() + .add("a", IntegerType, nullable = true, new MetadataBuilder().putString("x", "2").build()) + .add("b", StringType), + expected = "metadata for field a is different" + ) + + testReportDifferences("change of column type should be reported as a difference")( + existing = new StructType() + .add("a", IntegerType) + .add("b", StringType), + specified = new StructType() + .add("a", IntegerType) + .add("b", new ArrayType( + StringType, containsNull = false)), + expected = "type for b is different" + ) + + testReportDifferences("change of array nullability should be reported as a difference")( + existing = new StructType() + .add("a", IntegerType) + .add("b", new ArrayType( + new StructType().add("x", LongType), containsNull = true)), + specified = new StructType() + .add("a", IntegerType) + .add("b", new ArrayType( + new StructType().add("x", LongType), containsNull = false)), + expected = "b\\[\\] can not contain null in specified schema but can in existing" + ) + + testReportDifferences("change of element type should be reported as a difference")( + existing = new StructType() + .add("a", IntegerType) + .add("b", new ArrayType(LongType, containsNull = true)), + specified = new StructType() + .add("a", IntegerType) + .add("b", new ArrayType(StringType, containsNull = true)), + expected = "type for b\\[\\] is different" + ) + + testReportDifferences("change of element struct type should be reported as a difference")( + existing = new StructType() + .add("a", IntegerType) + .add("b", new ArrayType( + new StructType() + .add("x", LongType), + containsNull = true)), + specified = new StructType() + .add("a", IntegerType) + .add("b", new ArrayType( + new StructType() + .add("x", StringType), + containsNull = true)), + expected = "type for b\\[\\].x is different" + ) + + testReportDifferences("change of map value nullability should be reported as a difference")( + existing = new StructType() + .add("a", IntegerType) + .add("b", new MapType( + StringType, + new StructType().add("x", LongType), valueContainsNull = true)), + specified = new StructType() + .add("a", IntegerType) + .add("b", new MapType( + StringType, + new StructType().add("x", LongType), valueContainsNull = false)), + expected = "b can not contain null values in specified schema but can in existing" + ) + + testReportDifferences("change of map key type should be reported as a difference")( + existing = new StructType() + .add("a", IntegerType) + .add("b", new MapType(LongType, StringType, valueContainsNull = true)), + specified = new StructType() + .add("a", IntegerType) + .add("b", new MapType(StringType, StringType, valueContainsNull = true)), + expected = "type for b\\[key\\] is different" + ) + + testReportDifferences("change of value struct type should be reported as a difference")( + existing = new StructType() + .add("a", IntegerType) + .add("b", new MapType( + StringType, + new StructType().add("x", LongType), + valueContainsNull = true)), + specified = new StructType() + .add("a", IntegerType) + .add("b", new MapType( + StringType, + new StructType().add("x", FloatType), + valueContainsNull = true)), + expected = "type for b\\[value\\].x is different" + ) + + testReportDifferences("nested extra columns should be reported as a difference")( + existing = new StructType() + .add("x", new StructType() + .add("a", IntegerType)), + specified = new StructType() + .add("x", new StructType() + .add("a", IntegerType) + .add("b", StringType) + .add("c", LongType)), + expected = "additional field[(]s[)]: (x.b, x.c|x.c, x.b)" + ) + + testReportDifferences("nested missing columns should be reported as a difference")( + existing = new StructType() + .add("x", new StructType() + .add("a", IntegerType) + .add("b", StringType) + .add("c", FloatType)), + specified = new StructType() + .add("x", new StructType() + .add("a", IntegerType)), + expected = "missing field[(]s[)]: (x.b, x.c|x.c, x.b)" + ) + + testReportDifferences("making a nested column nullable should be reported as a difference")( + existing = new StructType() + .add("x", new StructType() + .add("a", IntegerType, nullable = false) + .add("b", StringType, nullable = true)), + specified = new StructType() + .add("x", new StructType() + .add("a", IntegerType, nullable = true) + .add("b", StringType, nullable = true)), + expected = "x.a is nullable in specified schema but non-nullable in existing schema" + ) + + testReportDifferences("making a nested column non-nullable should be reported as a difference")( + existing = new StructType() + .add("x", new StructType() + .add("a", IntegerType, nullable = false) + .add("b", StringType, nullable = true)), + specified = new StructType() + .add("x", new StructType() + .add("a", IntegerType, nullable = false) + .add("b", StringType, nullable = false)), + expected = "x.b is non-nullable in specified schema but nullable in existing schema" + ) + + testReportDifferences("change in nested column metadata should be reported as a difference")( + existing = new StructType() + .add("x", new StructType() + .add("a", IntegerType, nullable = true, new MetadataBuilder().putString("x", "1").build()) + .add("b", StringType)), + specified = new StructType() + .add("x", new StructType() + .add("a", IntegerType, nullable = true, new MetadataBuilder().putString("x", "2").build()) + .add("b", StringType)), + expected = "metadata for field x.a is different" + ) + + testReportDifferences("change of nested column type should be reported as a difference")( + existing = new StructType() + .add("x", new StructType() + .add("a", IntegerType) + .add("b", StringType)), + specified = new StructType() + .add("x", new StructType() + .add("a", IntegerType) + .add("b", new ArrayType( + StringType, containsNull = false))), + expected = "type for x.b is different" + ) + + testReportDifferences("change of nested array nullability should be reported as a difference")( + existing = new StructType() + .add("x", new StructType() + .add("a", IntegerType) + .add("b", new ArrayType( + new StructType() + .add("x", LongType), + containsNull = true))), + specified = new StructType() + .add("x", new StructType() + .add("a", IntegerType) + .add("b", new ArrayType( + new StructType() + .add("x", LongType), + containsNull = false))), + expected = "x.b\\[\\] can not contain null in specified schema but can in existing" + ) + + testReportDifferences("change of nested element type should be reported as a difference")( + existing = new StructType() + .add("x", new StructType() + .add("a", IntegerType) + .add("b", new ArrayType(LongType, containsNull = true))), + specified = new StructType() + .add("x", new StructType() + .add("a", IntegerType) + .add("b", new ArrayType(StringType, containsNull = true))), + expected = "type for x.b\\[\\] is different" + ) + + testReportDifferences("change of nested element struct type should be reported as a difference")( + existing = new StructType() + .add("x", new StructType() + .add("a", IntegerType) + .add("b", new ArrayType( + new StructType() + .add("x", LongType), + containsNull = true))), + specified = new StructType() + .add("x", new StructType() + .add("a", IntegerType) + .add("b", new ArrayType( + new StructType() + .add("x", StringType), + containsNull = true))), + expected = "type for x.b\\[\\].x is different" + ) + + private val piiTrue = new MetadataBuilder().putBoolean("pii", value = true).build() + private val piiFalse = new MetadataBuilder().putBoolean("pii", value = false).build() + + testReportDifferences("multiple differences should be reported")( + existing = new StructType() + .add("a", IntegerType) + .add("b", StringType) + .add("c", BinaryType) + .add("f", LongType, nullable = true, piiTrue) + .add("g", new MapType( + IntegerType, + new StructType() + .add("a", IntegerType, nullable = false, piiFalse) + .add("b", StringType) + .add("d", new ArrayType( + LongType, + containsNull = false + )), + valueContainsNull = true)) + .add("h", new MapType( + LongType, + StringType, + valueContainsNull = true)), + specified = new StructType() + .add("a", FloatType) + .add("d", StringType) + .add("e", LongType) + .add("f", LongType, nullable = false, piiFalse) + .add("g", new MapType( + StringType, + new StructType() + .add("a", LongType, nullable = true) + .add("c", StringType) + .add("d", new ArrayType( + BooleanType, + containsNull = true + )), + valueContainsNull = false)) + .add("h", new MapType( + LongType, + new ArrayType(IntegerType, containsNull = false), + valueContainsNull = true)), + "type for a is different", + "additional field[(]s[)]: (d, e|e, d)", + "missing field[(]s[)]: (b, c|c, b)", + "f is non-nullable in specified schema but nullable", + "metadata for field f is different", + "type for g\\[key\\] is different", + "g can not contain null values in specified schema but can in existing", + "additional field[(]s[)]: g\\[value\\].c", + "missing field[(]s[)]: g\\[value\\].b", + "type for g\\[value\\].a is different", + "g\\[value\\].a is nullable in specified schema but non-nullable in existing", + "metadata for field g\\[value\\].a is different", + "field g\\[value\\].d\\[\\] can contain null in specified schema but can not in existing", + "type for g\\[value\\].d\\[\\] is different", + "type for h\\[value\\] is different" + ) + + //////////////////////////// + // findColumnPosition + //////////////////////////// + + test("findColumnPosition") { + val schema = new StructType() + .add("a", new StructType() + .add("b", IntegerType) + .add("c", IntegerType)) + .add("d", ArrayType(new StructType() + .add("b", IntegerType) + .add("c", IntegerType))) + .add("e", StringType) + assert(SchemaUtils.findColumnPosition(Seq("a"), schema) === ((Seq(0), 2))) + assert(SchemaUtils.findColumnPosition(Seq("A"), schema) === ((Seq(0), 2))) + expectFailure("Couldn't find", schema.treeString) { + SchemaUtils.findColumnPosition(Seq("a", "d"), schema) + } + assert(SchemaUtils.findColumnPosition(Seq("a", "b"), schema) === ((Seq(0, 0), 0))) + assert(SchemaUtils.findColumnPosition(Seq("A", "b"), schema) === ((Seq(0, 0), 0))) + assert(SchemaUtils.findColumnPosition(Seq("a", "B"), schema) === ((Seq(0, 0), 0))) + assert(SchemaUtils.findColumnPosition(Seq("A", "B"), schema) === ((Seq(0, 0), 0))) + assert(SchemaUtils.findColumnPosition(Seq("a", "c"), schema) === ((Seq(0, 1), 0))) + assert(SchemaUtils.findColumnPosition(Seq("d"), schema) === ((Seq(1), 2))) + assert(SchemaUtils.findColumnPosition(Seq("d", "b"), schema) === ((Seq(1, 0), 0))) + assert(SchemaUtils.findColumnPosition(Seq("d", "B"), schema) === ((Seq(1, 0), 0))) + assert(SchemaUtils.findColumnPosition(Seq("d", "c"), schema) === ((Seq(1, 1), 0))) + assert(SchemaUtils.findColumnPosition(Seq("e"), schema) === ((Seq(2), 0))) + + val resolver = org.apache.spark.sql.catalyst.analysis.caseSensitiveResolution + Seq(Seq("A", "b"), Seq("a", "B"), Seq("d", "B")).foreach { column => + expectFailure("Couldn't find", schema.treeString) { + SchemaUtils.findColumnPosition(column, schema, resolver) + } + } + } + + test("findColumnPosition that doesn't exist") { + val schema = new StructType() + .add("a", IntegerType) + .add("b", MapType(StringType, StringType)) + expectFailure("Couldn't find", schema.treeString) { + SchemaUtils.findColumnPosition(Seq("c"), schema) + } + expectFailure("b.c", "mapType", schema.treeString) { + SchemaUtils.findColumnPosition(Seq("b", "c"), schema) + } + } + + //////////////////////////// + // addColumn + //////////////////////////// + + test("addColumn - simple") { + val a = StructField("a", IntegerType) + val b = StructField("b", StringType) + val schema = new StructType().add(a).add(b) + + val x = StructField("x", LongType) + assert(SchemaUtils.addColumn(schema, x, Seq(0)) === new StructType().add(x).add(a).add(b)) + assert(SchemaUtils.addColumn(schema, x, Seq(1)) === new StructType().add(a).add(x).add(b)) + assert(SchemaUtils.addColumn(schema, x, Seq(2)) === new StructType().add(a).add(b).add(x)) + + expectFailure("Index -1", "lower than 0") { + SchemaUtils.addColumn(schema, x, Seq(-1)) + } + expectFailure("Index 3", "larger than struct length: 2") { + SchemaUtils.addColumn(schema, x, Seq(3)) + } + expectFailure("Can only add nested columns to StructType") { + SchemaUtils.addColumn(schema, x, Seq(0, 0)) + } + } + + test("addColumn - nested struct") { + val a = StructField("a", IntegerType) + val b = StructField("b", StringType) + val s = StructField("s", new StructType().add(a).add(b)) + val schema = new StructType().add(s) + + val x = StructField("x", LongType) + assert(SchemaUtils.addColumn(schema, x, Seq(0)) === new StructType().add(x).add(s)) + assert(SchemaUtils.addColumn(schema, x, Seq(0, 0)) === + new StructType().add("s", new StructType().add(x).add(a).add(b))) + assert(SchemaUtils.addColumn(schema, x, Seq(0, 2)) === + new StructType().add("s", new StructType().add(a).add(b).add(x))) + assert(SchemaUtils.addColumn(schema, x, Seq(1)) === new StructType().add(s).add(x)) + + expectFailure("Index -1", "lower than 0") { + SchemaUtils.addColumn(schema, x, Seq(0, -1)) + } + expectFailure("Index 3", "larger than struct length: 2") { + SchemaUtils.addColumn(schema, x, Seq(0, 3)) + } + expectFailure("Struct not found at position 2") { + SchemaUtils.addColumn(schema, x, Seq(0, 2, 0)) + } + expectFailure("Can only add nested columns to StructType") { + SchemaUtils.addColumn(schema, x, Seq(0, 0, 0)) + } + } + + //////////////////////////// + // dropColumn + //////////////////////////// + + test("dropColumn - simple") { + val a = StructField("a", IntegerType) + val b = StructField("b", StringType) + val schema = new StructType().add(a).add(b) + + assert(SchemaUtils.dropColumn(schema, Seq(0)) === ((new StructType().add(b), a))) + assert(SchemaUtils.dropColumn(schema, Seq(1)) === ((new StructType().add(a), b))) + + expectFailure("Index -1", "lower than 0") { + SchemaUtils.dropColumn(schema, Seq(-1)) + } + expectFailure("Index 2", "equals to or is larger than struct length: 2") { + SchemaUtils.dropColumn(schema, Seq(2)) + } + expectFailure("Can only drop nested columns from StructType") { + SchemaUtils.dropColumn(schema, Seq(0, 0)) + } + } + + test("dropColumn - nested struct") { + val a = StructField("a", IntegerType) + val b = StructField("b", StringType) + val s = StructField("s", new StructType().add(a).add(b)) + val schema = new StructType().add(s) + + assert(SchemaUtils.dropColumn(schema, Seq(0)) === ((new StructType(), s))) + assert(SchemaUtils.dropColumn(schema, Seq(0, 0)) === + ((new StructType().add("s", new StructType().add(b)), a))) + assert(SchemaUtils.dropColumn(schema, Seq(0, 1)) === + ((new StructType().add("s", new StructType().add(a)), b))) + + expectFailure("Index -1", "lower than 0") { + SchemaUtils.dropColumn(schema, Seq(0, -1)) + } + expectFailure("Index 2", "equals to or is larger than struct length: 2") { + SchemaUtils.dropColumn(schema, Seq(0, 2)) + } + expectFailure("Can only drop nested columns from StructType") { + SchemaUtils.dropColumn(schema, Seq(0, 0, 0)) + } + } + + //////////////////////////// + // normalizeColumnNames + //////////////////////////// + + test("normalize column names") { + val df = Seq((1, 2, 3)).toDF("Abc", "def", "gHi") + val schema = new StructType() + .add("abc", IntegerType) + .add("Def", IntegerType) + .add("ghi", IntegerType) + assert(normalizeColumnNames(schema, df).schema.fieldNames === schema.fieldNames) + } + + test("normalize column names - different ordering") { + val df = Seq((1, 2, 3)).toDF("def", "gHi", "abC") + val schema = new StructType() + .add("abc", IntegerType) + .add("Def", IntegerType) + .add("ghi", IntegerType) + assert(normalizeColumnNames(schema, df).schema.fieldNames === Seq("Def", "ghi", "abc")) + } + + test("throw error if nested column cases don't match") { + val df = spark.read.json(Seq("""{"a":1,"b":{"X":1,"y":2}}""").toDS()) + val schema = new StructType() + .add("a", IntegerType) + .add("b", new StructType() + .add("x", IntegerType) + .add("y", IntegerType)) + expectFailure("[b.X]", "b.x") { + normalizeColumnNames(schema, df) + } + } + + test("can rename top level nested column") { + val df = spark.read.json(Seq("""{"a":1,"B":{"x":1,"y":2}}""").toDS()).select('a, 'b) + val schema = new StructType() + .add("a", IntegerType) + .add("b", new StructType() + .add("x", IntegerType) + .add("y", IntegerType)) + assert(normalizeColumnNames(schema, df).schema.fieldNames === Seq("a", "b")) + } + + //////////////////////////// + // mergeSchemas + //////////////////////////// + + test("mergeSchemas: missing columns in df") { + val base = new StructType().add("a", IntegerType).add("b", IntegerType) + val write = new StructType().add("a", IntegerType) + assert(mergeSchemas(base, write) === base) + } + + test("mergeSchemas: missing columns in df - case sensitivity") { + val base = new StructType().add("a", IntegerType).add("b", IntegerType) + val write = new StructType().add("A", IntegerType) + assert(mergeSchemas(base, write) === base) + } + + test("new columns get added to the tail of the schema") { + val base = new StructType().add("a", IntegerType) + val write = new StructType().add("a", IntegerType).add("b", IntegerType) + val write2 = new StructType().add("b", IntegerType).add("a", IntegerType) + assert(mergeSchemas(base, write) === write) + assert(mergeSchemas(base, write2) === write) + } + + test("new columns get added to the tail of the schema - nested") { + val base = new StructType() + .add("regular", StringType) + .add("struct", new StructType() + .add("a", IntegerType)) + + val write = new StructType() + .add("other", StringType) + .add("struct", new StructType() + .add("b", DateType) + .add("a", IntegerType)) + .add("this", StringType) + + val expected = new StructType() + .add("regular", StringType) + .add("struct", new StructType() + .add("a", IntegerType) + .add("b", DateType)) + .add("other", StringType) + .add("this", StringType) + assert(mergeSchemas(base, write) === expected) + } + + test("schema merging of incompatible types") { + val base = new StructType() + .add("top", StringType) + .add("struct", new StructType() + .add("a", IntegerType)) + .add("array", ArrayType(new StructType() + .add("b", DecimalType(18, 10)))) + .add("map", MapType(StringType, StringType)) + + expectFailure("StringType", "IntegerType") { + mergeSchemas(base, new StructType().add("top", IntegerType)) + } + expectFailure("IntegerType", "DateType") { + mergeSchemas(base, new StructType() + .add("struct", new StructType().add("a", DateType))) + } + expectFailure("'struct'", "structType", "MapType") { + mergeSchemas(base, new StructType() + .add("struct", MapType(StringType, IntegerType))) + } + expectFailure("'array'", "DecimalType", "DoubleType") { + mergeSchemas(base, new StructType() + .add("array", ArrayType(new StructType().add("b", DoubleType)))) + } + expectFailure("'array'", "scale") { + mergeSchemas(base, new StructType() + .add("array", ArrayType(new StructType().add("b", DecimalType(18, 12))))) + } + expectFailure("'array'", "precision") { + mergeSchemas(base, new StructType() + .add("array", ArrayType(new StructType().add("b", DecimalType(16, 10))))) + } + expectFailure("'map'", "MapType", "StructType") { + mergeSchemas(base, new StructType() + .add("map", new StructType().add("b", StringType))) + } + expectFailure("'map'", "StringType", "IntegerType") { + mergeSchemas(base, new StructType() + .add("map", MapType(StringType, IntegerType))) + } + expectFailure("'map'", "StringType", "IntegerType") { + mergeSchemas(base, new StructType() + .add("map", MapType(IntegerType, StringType))) + } + } + + test("schema merging should pick current nullable and metadata") { + val m = new MetadataBuilder().putDouble("a", 0.2).build() + val base = new StructType() + .add("top", StringType, nullable = false, m) + .add("struct", new StructType() + .add("a", IntegerType, nullable = false, m)) + .add("array", ArrayType(new StructType() + .add("b", DecimalType(18, 10))), nullable = false, m) + .add("map", MapType(StringType, StringType), nullable = false, m) + + assert(mergeSchemas(base, new StructType().add("top", StringType)) === base) + assert(mergeSchemas(base, new StructType().add("struct", new StructType() + .add("a", IntegerType))) === base) + assert(mergeSchemas(base, new StructType().add("array", ArrayType(new StructType() + .add("b", DecimalType(18, 10))))) === base) + assert(mergeSchemas(base, new StructType() + .add("map", MapType(StringType, StringType))) === base) + } + + test("schema merging null type") { + val base = new StructType().add("top", NullType) + val update = new StructType().add("top", StringType) + + assert(mergeSchemas(base, update) === update) + assert(mergeSchemas(update, base) === update) + } + + test("schema merging performs upcast between ByteType, ShortType, and LongType") { + val byteType = new StructType().add("top", ByteType) + val shortType = new StructType().add("top", ShortType) + val intType = new StructType().add("top", IntegerType) + + assert(mergeSchemas(byteType, shortType) === shortType) + assert(mergeSchemas(byteType, intType) === intType) + assert(mergeSchemas(shortType, intType) === intType) + assert(mergeSchemas(shortType, byteType) === shortType) + assert(mergeSchemas(intType, shortType) === intType) + assert(mergeSchemas(intType, byteType) === intType) + + val structInt = new StructType().add("top", new StructType().add("leaf", IntegerType)) + val structShort = new StructType().add("top", new StructType().add("leaf", ShortType)) + assert(mergeSchemas(structInt, structShort) === structInt) + + val map1 = new StructType().add("top", new MapType(IntegerType, ShortType, true)) + val map2 = new StructType().add("top", new MapType(ShortType, IntegerType, true)) + val mapMerged = new StructType().add("top", new MapType(IntegerType, IntegerType, true)) + assert(mergeSchemas(map1, map2) === mapMerged) + + val arrInt = new StructType().add("top", new ArrayType(IntegerType, true)) + val arrShort = new StructType().add("top", new ArrayType(ShortType, true)) + assert(mergeSchemas(arrInt, arrShort) === arrInt) + } + + test("Upcast between ByteType, ShortType and IntegerType is OK for parquet") { + import org.apache.spark.sql.functions._ + def testParquetUpcast(): Unit = { + withTempDir { dir => + val tempDir = dir.getCanonicalPath + spark.range(1.toByte).select(col("id") cast ByteType).write.save(tempDir + "/byte") + spark.range(1.toShort).select(col("id") cast ShortType).write.save(tempDir + "/short") + spark.range(1).select(col("id") cast IntegerType).write.save(tempDir + "/int") + + val shortSchema = new StructType().add("id", ShortType) + val intSchema = new StructType().add("id", IntegerType) + + spark.read.schema(shortSchema).parquet(tempDir + "/byte").collect() === Seq(Row(1.toShort)) + spark.read.schema(intSchema).parquet(tempDir + "/short").collect() === Seq(Row(1)) + spark.read.schema(intSchema).parquet(tempDir + "/byte").collect() === Seq(Row(1)) + } + } + + testParquetUpcast() + + } + //////////////////////////// + // transformColumns + //////////////////////////// + + test("transform columns - simple") { + val base = new StructType() + .add("a", IntegerType) + .add("b", StringType) + val update = new StructType() + .add("c", IntegerType) + .add("b", StringType) + + // Identity. + var visitedFields = 0 + val res1 = transformColumns(base) { + case (Seq(), field, _) => + visitedFields += 1 + field + } + assert(visitedFields === 2) + assert(base === res1) + + // Rename a -> c + visitedFields = 0 + val res2 = transformColumns(base) { + case (Seq(), field, _) => + visitedFields += 1 + val name = field.name + field.copy(name = if (name == "a") "c" else name) + } + assert(visitedFields === 2) + assert(update === res2) + + // Rename a -> c; using input map. + visitedFields = 0 + val res3 = transformColumns(base, (Seq("A"), "c") :: Nil) { + case (Seq(), field, Seq((_, newName))) => + visitedFields += 1 + field.copy(name = newName) + } + assert(visitedFields === 1) + assert(update === res3) + } + + test("transform columns - nested") { + val nested = new StructType() + .add("s1", IntegerType) + .add("s2", LongType) + val base = new StructType() + .add("nested", nested) + .add("arr", ArrayType(nested)) + .add("kvs", MapType(nested, nested)) + val update = new StructType() + .add("nested", + new StructType() + .add("t1", IntegerType) + .add("s2", LongType)) + .add("arr", ArrayType( + new StructType() + .add("s1", IntegerType) + .add("a2", LongType))) + .add("kvs", MapType( + new StructType() + .add("k1", IntegerType) + .add("s2", LongType), + new StructType() + .add("s1", IntegerType) + .add("v2", LongType))) + + // Identity. + var visitedFields = 0 + val res1 = transformColumns(base) { + case (_, field, _) => + visitedFields += 1 + field + } + assert(visitedFields === 11) + assert(base === res1) + + // Rename + visitedFields = 0 + val res2 = transformColumns(base) { (path, field, _) => + visitedFields += 1 + val name = path :+ field.name match { + case Seq("nested", "s1") => "t1" + case Seq("arr", "s2") => "a2" + case Seq("kvs", "key", "s1") => "k1" + case Seq("kvs", "value", "s2") => "v2" + case _ => field.name + } + field.copy(name = name) + } + assert(visitedFields === 11) + assert(update === res2) + + // Rename; using map + visitedFields = 0 + val mapping = Seq( + Seq("nested", "s1") -> "t1", + Seq("arr", "s2") -> "a2", + Seq("kvs", "key", "S1") -> "k1", + Seq("kvs", "value", "s2") -> "v2") + val res3 = transformColumns(base, mapping) { + case (_, field, Seq((_, name))) => + visitedFields += 1 + field.copy(name = name) + } + assert(visitedFields === 4) + assert(update === res3) + } +} From 5b3e3ebd68be9be7825e6b2b7018a0731ebba7b0 Mon Sep 17 00:00:00 2001 From: Rahul Mahadev Date: Wed, 4 Dec 2019 04:42:00 +0000 Subject: [PATCH 20/44] [SC-25748][DELTA] Scala/Python/SQL public APIs for Generate Delta Manifest ## What changes were proposed in this pull request? * Added Scala APIs and tests * Added Python APIs and tests * Added SQL APIs and tests in both Scala and Python closes delta-io/delta#262 ## How was this patch tested? Added tests in the 'DeltaGenerateManifest' suite Author: Rahul Mahadev #7053 is resolved by rahulsmahadev/generateManifestPub. GitOrigin-RevId: 8e31833ca0bc3b9a97128105861a84f63d086aba --- python/delta/tables.py | 15 +++ python/delta/tests/test_deltatable.py | 20 ++++ python/delta/tests/test_sql.py | 25 ++++ .../io/delta/sql/parser/DeltaSqlBase.g4 | 5 + .../io/delta/sql/parser/DeltaSqlParser.scala | 7 ++ .../scala/io/delta/tables/DeltaTable.scala | 18 +++ .../execution/DeltaTableOperations.scala | 12 +- .../apache/spark/sql/delta/DeltaErrors.scala | 7 ++ .../apache/spark/sql/delta/DeltaTable.scala | 31 ++++- .../delta/commands/DeltaGenerateCommand.scala | 68 +++++++++++ .../DeltaGenerateSymlinkManifestSuite.scala | 111 ++++++++++++++++++ 11 files changed, 317 insertions(+), 2 deletions(-) create mode 100644 src/main/scala/org/apache/spark/sql/delta/commands/DeltaGenerateCommand.scala diff --git a/python/delta/tables.py b/python/delta/tables.py index 67bccafefd4..4ac67aea09d 100644 --- a/python/delta/tables.py +++ b/python/delta/tables.py @@ -60,6 +60,21 @@ def alias(self, aliasName): jdt = self._jdt.alias(aliasName) return DeltaTable(self._spark, jdt) + @since(0.5) + def generate(self, mode): + """ + Generate manifest files for the given delta table. + + :param mode: mode for the type of manifest file to be generated + The valid modes are as follows (not case sensitive): + - "symlink_manifest_format" : This will generate manifests in symlink format + for Presto and Athena read support. + See the online documentation for more information. + + .. note:: Evolving + """ + self._jdt.generate(mode) + @since(0.4) def delete(self, condition=None): """ diff --git a/python/delta/tests/test_deltatable.py b/python/delta/tests/test_deltatable.py index 4071e7787e0..9fcac68f114 100644 --- a/python/delta/tests/test_deltatable.py +++ b/python/delta/tests/test_deltatable.py @@ -73,6 +73,26 @@ def test_delete(self): with self.assertRaises(TypeError): dt.delete(condition=1) + def test_generate(self): + # create a delta table + numFiles = 10 + self.spark.range(100).repartition(numFiles).write.format("delta").save(self.tempFile) + dt = DeltaTable.forPath(self.spark, self.tempFile) + + # Generate the symlink format manifest + dt.generate("symlink_format_manifest") + + # check the contents of the manifest + # NOTE: this is not a correctness test, we are testing correctness in the scala suite + manifestPath = os.path.join(self.tempFile, + os.path.join("_symlink_format_manifest", "manifest")) + files = [] + with open(manifestPath) as f: + files = f.readlines() + + # the number of files we write should equal the number of lines in the manifest + assert(len(files) == numFiles) + def test_update(self): self.__writeDeltaTable([('a', 1), ('b', 2), ('c', 3), ('d', 4)]) dt = DeltaTable.forPath(self.spark, self.tempFile) diff --git a/python/delta/tests/test_sql.py b/python/delta/tests/test_sql.py index 222f60e92ef..4873c86d95a 100644 --- a/python/delta/tests/test_sql.py +++ b/python/delta/tests/test_sql.py @@ -20,6 +20,7 @@ import os from pyspark.sql import SQLContext, functions, Row, SparkSession +from pyspark import SparkContext, SparkConf from delta.tables import DeltaTable from delta.testing.utils import PySparkTestCase @@ -62,6 +63,29 @@ def test_vacuum(self): def test_describe_history(self): assert(len(self.spark.sql("desc history delta.`%s`" % (self.temp_file)).collect()) > 0) + def test_generate(self): + # create a delta table + temp_path = tempfile.mkdtemp() + temp_file = os.path.join(temp_path, "delta_sql_test_table") + numFiles = 10 + self.spark.range(100).repartition(numFiles).write.format("delta").save(temp_file) + + # Generate the symlink format manifest + self.spark.sql("GENERATE SYMLINK_FORMAT_MANIFEST FOR TABLE delta.`{}`" + .format(temp_file)) + + # check the contents of the manifest + # NOTE: this is not a correctness test, we are testing correctness in the scala suite + manifestPath = os.path.join(temp_file, + os.path.join("_symlink_format_manifest", "manifest")) + files = [] + with open(manifestPath) as f: + files = f.readlines() + + shutil.rmtree(temp_path) + # the number of files we write should equal the number of lines in the manifest + assert(len(files) == numFiles) + def test_convert(self): df = self.spark.createDataFrame([('a', 1), ('b', 2), ('c', 3)], ["key", "value"]) temp_path2 = tempfile.mkdtemp() @@ -95,6 +119,7 @@ def __checkAnswer(self, df, expectedAnswer, schema=["key", "value"]): self.assertEqual([], df.subtract(expectedDF).take(1)) self.assertEqual([], expectedDF.subtract(df).take(1)) + if __name__ == "__main__": try: import xmlrunner diff --git a/src/main/antlr4/io/delta/sql/parser/DeltaSqlBase.g4 b/src/main/antlr4/io/delta/sql/parser/DeltaSqlBase.g4 index 093092c0830..7a60891530d 100644 --- a/src/main/antlr4/io/delta/sql/parser/DeltaSqlBase.g4 +++ b/src/main/antlr4/io/delta/sql/parser/DeltaSqlBase.g4 @@ -75,6 +75,7 @@ statement : VACUUM (path=STRING | table=qualifiedName) (RETAIN number HOURS)? (DRY RUN)? #vacuumTable | (DESC | DESCRIBE) DETAIL (path=STRING | table=qualifiedName) #describeDeltaDetail + | GENERATE modeName=identifier FOR TABLE table=qualifiedName #generate | (DESC | DESCRIBE) HISTORY (path=STRING | table=qualifiedName) (LIMIT limit=INTEGER_VALUE)? #describeDeltaHistory | CONVERT TO DELTA table=qualifiedName @@ -124,6 +125,7 @@ nonReserved : VACUUM | RETAIN | HOURS | DRY | RUN | CONVERT | TO | DELTA | PARTITIONED | BY | DESC | DESCRIBE | LIMIT | DETAIL + | GENERATE | FOR | TABLE ; // Define how the keywords above should appear in a user's SQL statement. @@ -134,6 +136,7 @@ DELTA: 'DELTA'; DESC: 'DESC'; DESCRIBE: 'DESCRIBE'; DETAIL: 'DETAIL'; +GENERATE: 'GENERATE'; DRY: 'DRY'; HISTORY: 'HISTORY'; HOURS: 'HOURS'; @@ -141,6 +144,8 @@ LIMIT: 'LIMIT'; MINUS: '-'; NOT: 'NOT' | '!'; NULL: 'NULL'; +FOR: 'FOR'; +TABLE: 'TABLE'; PARTITIONED: 'PARTITIONED'; RETAIN: 'RETAIN'; RUN: 'RUN'; diff --git a/src/main/scala/io/delta/sql/parser/DeltaSqlParser.scala b/src/main/scala/io/delta/sql/parser/DeltaSqlParser.scala index 117dab85cec..77580aa7c4d 100644 --- a/src/main/scala/io/delta/sql/parser/DeltaSqlParser.scala +++ b/src/main/scala/io/delta/sql/parser/DeltaSqlParser.scala @@ -42,6 +42,7 @@ import java.util.Locale import scala.collection.JavaConverters._ +import org.apache.spark.sql.delta.commands.DeltaGenerateCommand import io.delta.sql.parser.DeltaSqlBaseParser._ import io.delta.tables.execution.{DescribeDeltaHistoryCommand, VacuumTableCommand} import org.antlr.v4.runtime._ @@ -168,6 +169,12 @@ class DeltaSqlAstBuilder extends DeltaSqlBaseBaseVisitor[AnyRef] { Option(ctx.limit).map(_.getText.toInt)) } + override def visitGenerate(ctx: GenerateContext): LogicalPlan = withOrigin(ctx) { + DeltaGenerateCommand( + modeName = ctx.modeName.getText, + tableId = visitTableIdentifier(ctx.table)) + } + override def visitConvert(ctx: ConvertContext): LogicalPlan = withOrigin(ctx) { ConvertToDeltaCommand( visitTableIdentifier(ctx.table), diff --git a/src/main/scala/io/delta/tables/DeltaTable.scala b/src/main/scala/io/delta/tables/DeltaTable.scala index eac708e9b04..c590237e088 100644 --- a/src/main/scala/io/delta/tables/DeltaTable.scala +++ b/src/main/scala/io/delta/tables/DeltaTable.scala @@ -135,6 +135,24 @@ class DeltaTable private[tables](df: Dataset[Row], deltaLog: DeltaLog) executeHistory(deltaLog, None) } + /** + * :: Evolving :: + * + * Generate a manifest for the given Delta Table + * + * @param mode Specifies the mode for the generation of the manifest. + * The valid modes are as follows (not case sensitive): + * - "symlink_manifest_format" : This will generate manifests in symlink format + * for Presto and Athena read support. + * See the online documentation for more information. + * @since 0.5.0 + */ + @Evolving + def generate(mode: String): Unit = { + val path = deltaLog.dataPath.toString + executeGenerate(s"delta.`$path`", mode) + } + /** * :: Evolving :: * diff --git a/src/main/scala/io/delta/tables/execution/DeltaTableOperations.scala b/src/main/scala/io/delta/tables/execution/DeltaTableOperations.scala index 3925aaf8c4a..bdac5bd7ac1 100644 --- a/src/main/scala/io/delta/tables/execution/DeltaTableOperations.scala +++ b/src/main/scala/io/delta/tables/execution/DeltaTableOperations.scala @@ -19,11 +19,12 @@ package io.delta.tables.execution import scala.collection.Map import org.apache.spark.sql.delta.{DeltaErrors, DeltaHistoryManager, DeltaLog, PreprocessTableUpdate} -import org.apache.spark.sql.delta.commands.{DeleteCommand, VacuumCommand} +import org.apache.spark.sql.delta.commands.{DeleteCommand, DeltaGenerateCommand, VacuumCommand} import org.apache.spark.sql.delta.util.AnalysisHelper import io.delta.tables.DeltaTable import org.apache.spark.sql.{functions, Column, DataFrame} +import org.apache.spark.sql.catalyst.TableIdentifier import org.apache.spark.sql.catalyst.analysis.UnresolvedAttribute import org.apache.spark.sql.catalyst.expressions.{Expression, SubqueryExpression} import org.apache.spark.sql.catalyst.plans.logical._ @@ -69,6 +70,15 @@ trait DeltaTableOperations extends AnalysisHelper { self: DeltaTable => spark.createDataFrame(history.getHistory(limit)) } + protected def executeGenerate(tblIdentifier: String, mode: String): Unit = { + val tableId: TableIdentifier = sparkSession + .sessionState + .sqlParser + .parseTableIdentifier(tblIdentifier) + val generate = DeltaGenerateCommand(mode, tableId) + generate.run(sparkSession) + } + protected def executeUpdate(set: Map[String, Column], condition: Option[Column]): Unit = { val setColumns = set.map{ case (col, expr) => (col, expr) }.toSeq diff --git a/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala b/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala index b12b0b9f35e..4664c1efcb8 100644 --- a/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala +++ b/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala @@ -687,6 +687,13 @@ object DeltaErrors } new RuntimeException(errorMessage, error) } + + def unsupportedGenerateModeException(modeName: String): Throwable = { + import org.apache.spark.sql.delta.commands.DeltaGenerateCommand + val supportedModes = DeltaGenerateCommand.modeNameToGenerationFunc.keys.toSeq.mkString(", ") + new IllegalArgumentException( + s"Specified mode '$modeName' is not supported. Supported modes are: $supportedModes") + } } /** The basic class for all Tahoe commit conflict exceptions. */ diff --git a/src/main/scala/org/apache/spark/sql/delta/DeltaTable.scala b/src/main/scala/org/apache/spark/sql/delta/DeltaTable.scala index ab294261c22..5303a00a110 100644 --- a/src/main/scala/org/apache/spark/sql/delta/DeltaTable.scala +++ b/src/main/scala/org/apache/spark/sql/delta/DeltaTable.scala @@ -17,6 +17,8 @@ package org.apache.spark.sql.delta // scalastyle:off import.ordering.noEmptyLine +import java.util.Locale + import scala.util.Try import org.apache.spark.sql.delta.files.{TahoeFileIndex, TahoeLogFileIndex} @@ -26,7 +28,8 @@ import org.apache.hadoop.fs.Path import org.apache.spark.sql.{AnalysisException, SparkSession} import org.apache.spark.sql.catalyst.TableIdentifier -import org.apache.spark.sql.catalyst.catalog.CatalogTable +import org.apache.spark.sql.catalyst.analysis.NoSuchTableException +import org.apache.spark.sql.catalyst.catalog.{CatalogTable, SessionCatalog} import org.apache.spark.sql.catalyst.expressions.{Expression, PredicateHelper, SubqueryExpression} import org.apache.spark.sql.catalyst.plans.logical.LogicalPlan import org.apache.spark.sql.execution.datasources.{FileIndex, HadoopFsRelation, LogicalRelation} @@ -89,6 +92,32 @@ object DeltaTableUtils extends PredicateHelper findDeltaTableRoot(spark, path).isDefined } + /** + * Checks whether TableIdentifier is a path or a table name + * We assume it is a path unless the table and database both exist in the catalog@param catalog + * + * @param tableIdent the provided table or path + * @return true if using table name, false if using path, error otherwise + */ + def isCatalogTable(catalog: SessionCatalog, tableIdent: TableIdentifier): Boolean = { + val dbExists = tableIdent.database.forall(catalog.databaseExists) + val dbNameIsAlsoValidFormatName = + tableIdent.database.getOrElse("").toLowerCase(Locale.ROOT) == "parquet" || + DeltaSourceUtils.isDeltaDataSourceName(tableIdent.database.getOrElse("")) + + // If db doesnt exist or db is called parquet/delta/tahoe then check if path exists + if ((!dbExists || dbNameIsAlsoValidFormatName) && new Path(tableIdent.table).isAbsolute) { + return false + } + + // check for dbexists otherwise catalog.tableExists may throw NoSuchDatabaseException + if ((dbExists || tableIdent.database.isEmpty) && catalog.tableExists(tableIdent)) { + true + } else { + throw new NoSuchTableException(tableIdent.database.getOrElse(""), tableIdent.table) + } + } + /** Find the root of a Delta table from the provided path. */ def findDeltaTableRoot( spark: SparkSession, diff --git a/src/main/scala/org/apache/spark/sql/delta/commands/DeltaGenerateCommand.scala b/src/main/scala/org/apache/spark/sql/delta/commands/DeltaGenerateCommand.scala new file mode 100644 index 00000000000..c4dacafafb0 --- /dev/null +++ b/src/main/scala/org/apache/spark/sql/delta/commands/DeltaGenerateCommand.scala @@ -0,0 +1,68 @@ +/* + * Copyright 2019 Databricks, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.spark.sql.delta.commands + +import org.apache.spark.sql.delta.{DeltaErrors, DeltaLog, DeltaTableIdentifier} +import org.apache.spark.sql.delta.hooks.GenerateSymlinkManifest +import org.apache.hadoop.fs.Path + +import org.apache.spark.sql.{AnalysisException, Row, SparkSession} +import org.apache.spark.sql.catalyst.TableIdentifier +import org.apache.spark.sql.catalyst.util.CaseInsensitiveMap +import org.apache.spark.sql.execution.command.RunnableCommand + +trait DeltaGenerateCommandBase extends RunnableCommand { + + protected def getPath(spark: SparkSession, tableId: TableIdentifier): Path = { + DeltaTableIdentifier(spark, tableId) match { + case Some(id) if id.path.isDefined => new Path(id.path.get) + case Some(id) => + throw DeltaErrors.tableNotSupportedException("DELTA GENERATE") + case None => + // This is not a Delta table. + val metadata = spark.sessionState.catalog.getTableMetadata(tableId) + new Path(metadata.location) + } + } +} + +case class DeltaGenerateCommand(modeName: String, tableId: TableIdentifier) + extends DeltaGenerateCommandBase { + + import DeltaGenerateCommand._ + + override def run(sparkSession: SparkSession): Seq[Row] = { + if (!modeNameToGenerationFunc.contains(modeName)) { + throw DeltaErrors.unsupportedGenerateModeException(modeName) + } + val tablePath = getPath(sparkSession, tableId) + val deltaLog = DeltaLog.forTable(sparkSession, tablePath) + if (deltaLog.snapshot.version < 0) { + throw new AnalysisException(s"Delta table not found at $tablePath.") + } + val generationFunc = modeNameToGenerationFunc(modeName) + generationFunc(sparkSession, deltaLog) + Seq.empty + } +} + +object DeltaGenerateCommand { + val modeNameToGenerationFunc = CaseInsensitiveMap( + Map[String, (SparkSession, DeltaLog) => Unit]( + "symlink_format_manifest" -> GenerateSymlinkManifest.generateFullManifest + )) +} diff --git a/src/test/scala/org/apache/spark/sql/delta/DeltaGenerateSymlinkManifestSuite.scala b/src/test/scala/org/apache/spark/sql/delta/DeltaGenerateSymlinkManifestSuite.scala index 70abf1bb12c..8385fc5d805 100644 --- a/src/test/scala/org/apache/spark/sql/delta/DeltaGenerateSymlinkManifestSuite.scala +++ b/src/test/scala/org/apache/spark/sql/delta/DeltaGenerateSymlinkManifestSuite.scala @@ -19,7 +19,9 @@ package org.apache.spark.sql.delta import java.io.File import java.net.URI +import org.apache.spark.sql.delta.commands.DeltaGenerateCommand import org.apache.spark.sql.delta.hooks.GenerateSymlinkManifest +import org.apache.spark.sql.delta.test.DeltaSQLCommandTest import org.apache.spark.sql.delta.util.DeltaFileOperations import org.apache.hadoop.conf.Configuration import org.apache.hadoop.fs._ @@ -31,6 +33,7 @@ import org.apache.spark.sql.test.SharedSparkSession class DeltaGenerateSymlinkManifestSuite extends DeltaGenerateSymlinkManifestSuiteBase + with DeltaSQLCommandTest trait DeltaGenerateSymlinkManifestSuiteBase extends QueryTest with SharedSparkSession { @@ -114,6 +117,27 @@ trait DeltaGenerateSymlinkManifestSuiteBase extends QueryTest } } + test("full manifest: throw error on non delta table paths") { + withTempDir { dir => + var e = intercept[AnalysisException] { + spark.sql(s"GENERATE symlink_format_manifest FOR TABLE delta.`$dir`") + } + assert(e.getMessage.contains("not found")) + + spark.range(2).write.format("parquet").mode("overwrite").save(dir.toString) + + e = intercept[AnalysisException] { + spark.sql(s"GENERATE symlink_format_manifest FOR TABLE delta.`$dir`") + } + assert(e.getMessage.contains("table not found")) + + e = intercept[AnalysisException] { + spark.sql(s"GENERATE symlink_format_manifest FOR TABLE parquet.`$dir`") + } + assert(e.getMessage.contains("not found")) + } + } + test("incremental manifest: table property controls post commit manifest generation") { withTempDir { tablePath => tablePath.delete() @@ -322,6 +346,93 @@ trait DeltaGenerateSymlinkManifestSuiteBase extends QueryTest } } + test("full manifest: scala api") { + withTempDir { tablePath => + tablePath.delete() + + def write(parallelism: Int): Unit = { + spark.createDataset(spark.sparkContext.parallelize(1 to 100, parallelism)) + .write.format("delta").mode("overwrite").save(tablePath.toString) + } + + write(7) + assertManifest(tablePath, expectSameFiles = false, expectedNumFiles = 0) + + // Create a Delta table and call the scala api for generating manifest files + val deltaTable = io.delta.tables.DeltaTable.forPath(tablePath.getAbsolutePath) + deltaTable.generate("symlink_format_manifest") + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = 7) + } + } + + test("full manifest: SQL command") { + withTable("deltaTable") { + withTempDir { tablePath => + tablePath.delete() + + def write(parallelism: Int, partitions1: Int, partitions2: Int): Unit = { + spark.createDataset(spark.sparkContext.parallelize(1 to 100, parallelism)).toDF("value") + .withColumn("part1", $"value" % partitions1) + .withColumn("part2", $"value" % partitions2) + .write.format("delta").partitionBy("part1", "part2") + .mode("overwrite") + .option("path", tablePath.toString) + .save(tablePath.getAbsolutePath) + } + + val path = tablePath.getAbsolutePath + write(10, 10, 10) + assertManifest(tablePath, expectSameFiles = false, expectedNumFiles = 0) + spark.sql(s"""GENERATE symlink_ForMat_Manifest FOR TABLE delta.`$path`""") + + // 10 files each in ../part1=X/part2=X/ for X = 0 to 9 + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = 100) + + // Reduce # partitions on both dimensions + write(1, 1, 1) + assertManifest(tablePath, expectSameFiles = false, expectedNumFiles = 100) + spark.sql(s"""GENERATE SYMLINK_FORMAT_MANIFEST FOR TABLE delta.`$path`""") + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = 1) + + // Increase # partitions on both dimensions + write(5, 5, 5) + assertManifest(tablePath, expectSameFiles = false, expectedNumFiles = 1) + spark.sql(s"GENERATE symlink_ForMat_Manifest FOR TABLE delta.`$path`") + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = 25) + + // Increase # partitions on only one dimension + write(5, 10, 5) + assertManifest(tablePath, expectSameFiles = false, expectedNumFiles = 25) + spark.sql(s"GENERATE symlink_format_manifest FOR TABLE delta.`$path`") + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = 50) + + // Remove all data + spark.emptyDataset[Int].toDF("value") + .withColumn("part1", $"value" % 10) + .withColumn("part2", $"value" % 10) + .write.format("delta").mode("overwrite").save(tablePath.toString) + assertManifest(tablePath, expectSameFiles = false, expectedNumFiles = 50) + spark.sql(s"GENERATE symlink_ForMat_Manifest FOR TABLE delta.`$path`") + assertManifest(tablePath, expectSameFiles = true, expectedNumFiles = 0) + assert(spark.read.format("delta") + .load(tablePath.getAbsolutePath).count() == 0) + } + } + } + + test("full manifest: SQL command - throw error on unsupported mode") { + withTempDir { tablePath => + spark.range(2).write.format("delta").save(tablePath.getAbsolutePath) + val e = intercept[IllegalArgumentException] { + spark.sql(s"GENERATE xyz FOR TABLE delta.`${tablePath.getAbsolutePath}`") + } + assert(e.toString.contains("not supported")) + DeltaGenerateCommand.modeNameToGenerationFunc.keys.foreach { modeName => + assert(e.toString.contains(modeName)) + } + } + } + def assertManifest(tablePath: File, expectSameFiles: Boolean, expectedNumFiles: Int): Unit = { val deltaSnapshot = DeltaLog.forTable(spark, tablePath.toString).update() val manifestPath = new File(tablePath, GenerateSymlinkManifest.MANIFEST_LOCATION) From 2a322facb5c57e7322302ab878eddb16ff21b5f1 Mon Sep 17 00:00:00 2001 From: Shixiong Zhu Date: Wed, 4 Dec 2019 23:27:00 +0000 Subject: [PATCH 21/44] [SC-26576]Minor refactor for DescribeDeltaDetailCommand ## What changes were proposed in this pull request? Rename files to make them consistent with other codes. ## How was this patch tested? Existing tests. Author: Shixiong Zhu #7197 is resolved by zsxwing/refactor-describe-detail. GitOrigin-RevId: fac330b592f61e43e1abfe7426050d91d85b29a5 --- .../io/delta/sql/parser/DeltaSqlParser.scala | 4 +- .../DescribeDeltaDetailsCommand.scala | 24 ++++++++ .../DescribeDeltaDetailsCommandBase.scala | 33 +++++++++-- .../DescribeDeltaDetailsCommandOSS.scala | 57 ------------------- 4 files changed, 54 insertions(+), 64 deletions(-) create mode 100644 src/main/scala/org/apache/spark/sql/delta/commands/DescribeDeltaDetailsCommand.scala delete mode 100644 src/main/scala/org/apache/spark/sql/delta/commands/DescribeDeltaDetailsCommandOSS.scala diff --git a/src/main/scala/io/delta/sql/parser/DeltaSqlParser.scala b/src/main/scala/io/delta/sql/parser/DeltaSqlParser.scala index 77580aa7c4d..57b5aeaed77 100644 --- a/src/main/scala/io/delta/sql/parser/DeltaSqlParser.scala +++ b/src/main/scala/io/delta/sql/parser/DeltaSqlParser.scala @@ -57,7 +57,7 @@ import org.apache.spark.sql.catalyst.parser.{ParseErrorListener, ParseException, import org.apache.spark.sql.catalyst.parser.ParserUtils.{string, withOrigin} import org.apache.spark.sql.catalyst.plans.logical.LogicalPlan import org.apache.spark.sql.catalyst.trees.Origin -import org.apache.spark.sql.delta.commands.DescribeDeltaDetailCommandOSS +import org.apache.spark.sql.delta.commands.DescribeDeltaDetailCommand import org.apache.spark.sql.delta.commands.ConvertToDeltaCommand import org.apache.spark.sql.types._ @@ -156,7 +156,7 @@ class DeltaSqlAstBuilder extends DeltaSqlBaseBaseVisitor[AnyRef] { override def visitDescribeDeltaDetail( ctx: DescribeDeltaDetailContext): LogicalPlan = withOrigin(ctx) { - DescribeDeltaDetailCommandOSS( + DescribeDeltaDetailCommand( Option(ctx.path).map(string), Option(ctx.table).map(visitTableIdentifier)) } diff --git a/src/main/scala/org/apache/spark/sql/delta/commands/DescribeDeltaDetailsCommand.scala b/src/main/scala/org/apache/spark/sql/delta/commands/DescribeDeltaDetailsCommand.scala new file mode 100644 index 00000000000..86d1020b308 --- /dev/null +++ b/src/main/scala/org/apache/spark/sql/delta/commands/DescribeDeltaDetailsCommand.scala @@ -0,0 +1,24 @@ +/* + * Copyright 2019 Databricks, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.spark.sql.delta.commands + +import org.apache.spark.sql.catalyst.TableIdentifier + +case class DescribeDeltaDetailCommand( + override val path: Option[String], + override val tableIdentifier: Option[TableIdentifier]) + extends DescribeDeltaDetailCommandBase diff --git a/src/main/scala/org/apache/spark/sql/delta/commands/DescribeDeltaDetailsCommandBase.scala b/src/main/scala/org/apache/spark/sql/delta/commands/DescribeDeltaDetailsCommandBase.scala index 7d99d3e4967..404d4bfbe39 100644 --- a/src/main/scala/org/apache/spark/sql/delta/commands/DescribeDeltaDetailsCommandBase.scala +++ b/src/main/scala/org/apache/spark/sql/delta/commands/DescribeDeltaDetailsCommandBase.scala @@ -20,7 +20,7 @@ package org.apache.spark.sql.delta.commands import java.io.FileNotFoundException import java.sql.Timestamp -import org.apache.spark.sql.delta.{DeltaLog, Snapshot} +import org.apache.spark.sql.delta.{DeltaErrors, DeltaLog, DeltaTableIdentifier, Snapshot} import org.apache.spark.sql.delta.metering.DeltaLogging import org.apache.spark.sql.delta.util.FileNames import org.apache.hadoop.fs.Path @@ -51,9 +51,11 @@ case class TableDetail( /** * A command for describing the details of a table such as the format, name, and size. */ -abstract class DescribeDeltaDetailCommandBase( - path: Option[String], - tableIdentifier: Option[TableIdentifier]) extends RunnableCommand with DeltaLogging { +trait DescribeDeltaDetailCommandBase extends RunnableCommand with DeltaLogging { + + val path: Option[String] + + val tableIdentifier: Option[TableIdentifier] private val encoder = ExpressionEncoder[TableDetail]() @@ -88,11 +90,32 @@ abstract class DescribeDeltaDetailCommandBase( * Resolve `path` and `tableIdentifier` to get the underlying storage path, and its `CatalogTable` * if it's a table. The caller will make sure either `path` or `tableIdentifier` is set but not * both. + * + * If `path` is set, return it and an empty `CatalogTable` since it's a physical path. If + * `tableIdentifier` is set, we will try to see if it's a Delta data source path (such as + * `delta.`). If so, we will return the path and an empty `CatalogTable`. Otherwise, + * we will use `SessionCatalog` to resolve `tableIdentifier`. */ protected def getPathAndTableMetadata( spark: SparkSession, path: Option[String], - tableIdentifier: Option[TableIdentifier]): (Path, Option[CatalogTable]) + tableIdentifier: Option[TableIdentifier]): (Path, Option[CatalogTable]) = { + path.map(new Path(_) -> None).orElse { + tableIdentifier.map { i => + DeltaTableIdentifier(spark, tableIdentifier.get) match { + case Some(id) if id.path.isDefined => new Path(id.path.get) -> None + case Some(id) => + throw DeltaErrors.tableNotSupportedException("DESCRIBE DETAIL") + case None => + // This is not a Delta table. + val metadata = spark.sessionState.catalog.getTableMetadata(i) + new Path(metadata.location) -> Some(metadata) + } + } + }.getOrElse { + throw DeltaErrors.missingTableIdentifierException("DESCRIBE DETAIL") + } + } private def describeNonDeltaTable(table: CatalogTable): Seq[Row] = { Seq(rowEncoder.fromRow(encoder.toRow( diff --git a/src/main/scala/org/apache/spark/sql/delta/commands/DescribeDeltaDetailsCommandOSS.scala b/src/main/scala/org/apache/spark/sql/delta/commands/DescribeDeltaDetailsCommandOSS.scala deleted file mode 100644 index 8f3e6985f2c..00000000000 --- a/src/main/scala/org/apache/spark/sql/delta/commands/DescribeDeltaDetailsCommandOSS.scala +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2019 Databricks, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.spark.sql.delta.commands - -import org.apache.spark.sql.delta.{DeltaErrors, DeltaTableIdentifier} -import org.apache.hadoop.fs.Path - -import org.apache.spark.sql.SparkSession -import org.apache.spark.sql.catalyst.TableIdentifier -import org.apache.spark.sql.catalyst.catalog.CatalogTable - -case class DescribeDeltaDetailCommandOSS( - path: Option[String], - tableIdentifier: Option[TableIdentifier]) - extends DescribeDeltaDetailCommandBase(path, tableIdentifier) { - - /** - * If `path` is set, return it and an empty `CatalogTable` since it's a physical path. If - * `tableIdentifier` is set, we will try to see if it's a Delta data source path (such as - * `delta.`). If so, we will return the path and an empty `CatalogTable`. Otherwise, - * we will use `SessionCatalog` to resolve `tableIdentifier`. - */ - override protected def getPathAndTableMetadata( - spark: SparkSession, - path: Option[String], - tableIdentifier: Option[TableIdentifier]): (Path, Option[CatalogTable]) = { - path.map(new Path(_) -> None).orElse { - tableIdentifier.map { i => - DeltaTableIdentifier(spark, tableIdentifier.get) match { - case Some(id) if id.path.isDefined => new Path(id.path.get) -> None - case Some(id) => - throw DeltaErrors.tableNotSupportedException("DESCRIBE DETAIL") - case None => - // This is not a Delta table. - val metadata = spark.sessionState.catalog.getTableMetadata(i) - new Path(metadata.location) -> Some(metadata) - } - } - }.getOrElse { - throw DeltaErrors.missingTableIdentifierException("DESCRIBE DETAIL") - } - } -} From 48a74fa83858d164d1f789947981445a06cb2668 Mon Sep 17 00:00:00 2001 From: Burak Yavuz Date: Thu, 5 Dec 2019 21:37:13 +0000 Subject: [PATCH 22/44] [SC-25475][DELTA] Add the `ReplaceTable` operation for Spark 3.0 Author: Burak Yavuz Author: Burak Yavuz GitOrigin-RevId: a477dde19a4dea5a724697acc0fa4f9201713cee --- .../apache/spark/sql/delta/DeltaOperations.scala | 14 ++++++++++++++ .../spark/sql/delta/sources/DeltaDataSource.scala | 2 ++ .../org/apache/spark/sql/delta/DeltaSuite.scala | 6 +++--- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/main/scala/org/apache/spark/sql/delta/DeltaOperations.scala b/src/main/scala/org/apache/spark/sql/delta/DeltaOperations.scala index 024d09d55a1..547e87222e2 100644 --- a/src/main/scala/org/apache/spark/sql/delta/DeltaOperations.scala +++ b/src/main/scala/org/apache/spark/sql/delta/DeltaOperations.scala @@ -121,6 +121,20 @@ object DeltaOperations { "partitionBy" -> JsonUtils.toJson(metadata.partitionColumns), "properties" -> JsonUtils.toJson(metadata.configuration)) } + /** Recorded when the table is replaced. */ + case class ReplaceTable( + metadata: Metadata, + isManaged: Boolean, + orCreate: Boolean, + asSelect: Boolean = false) + extends Operation(s"${if (orCreate) "CREATE OR " else ""}REPLACE TABLE" + + s"${if (asSelect) " AS SELECT" else ""}") { + override val parameters: Map[String, Any] = Map( + "isManaged" -> isManaged.toString, + "description" -> Option(metadata.description), + "partitionBy" -> JsonUtils.toJson(metadata.partitionColumns), + "properties" -> JsonUtils.toJson(metadata.configuration)) + } /** Recorded when the table properties are set. */ case class SetTableProperties( properties: Map[String, String]) extends Operation("SET TBLPROPERTIES") { diff --git a/src/main/scala/org/apache/spark/sql/delta/sources/DeltaDataSource.scala b/src/main/scala/org/apache/spark/sql/delta/sources/DeltaDataSource.scala index f28a39e6ef5..1f370854c31 100644 --- a/src/main/scala/org/apache/spark/sql/delta/sources/DeltaDataSource.scala +++ b/src/main/scala/org/apache/spark/sql/delta/sources/DeltaDataSource.scala @@ -18,6 +18,7 @@ package org.apache.spark.sql.delta.sources import scala.util.{Failure, Success, Try} +// scalastyle:off import.ordering.noEmptyLine import org.apache.spark.sql.delta._ import org.apache.spark.sql.delta.commands.WriteIntoDelta import org.apache.spark.sql.delta.metering.DeltaLogging @@ -51,6 +52,7 @@ class DeltaDataSource spark.conf.set("spark.sql.legacy.sources.write.passPartitionByAsOptions", "true") } + override def sourceSchema( sqlContext: SQLContext, schema: Option[StructType], diff --git a/src/test/scala/org/apache/spark/sql/delta/DeltaSuite.scala b/src/test/scala/org/apache/spark/sql/delta/DeltaSuite.scala index 25f9d2ebd82..8b07f241b31 100644 --- a/src/test/scala/org/apache/spark/sql/delta/DeltaSuite.scala +++ b/src/test/scala/org/apache/spark/sql/delta/DeltaSuite.scala @@ -561,15 +561,15 @@ class DeltaSuite extends QueryTest test("metadataOnly query") { withSQLConf(OPTIMIZER_METADATA_ONLY.key -> "true") { - withTable("tahoe_test") { + withTable("delta_test") { Seq(1L -> "a").toDF("dataCol", "partCol") .write .mode(SaveMode.Overwrite) .partitionBy("partCol") .format("delta") - .saveAsTable("tahoe_test") + .saveAsTable("delta_test") checkAnswer( - sql("select count(distinct partCol) FROM tahoe_test"), + sql("select count(distinct partCol) FROM delta_test"), Row(1)) } } From f32830022e6a664f99f25f3dad8584f5cd9952bf Mon Sep 17 00:00:00 2001 From: Tathagata Das Date: Fri, 6 Dec 2019 09:54:27 +0000 Subject: [PATCH 23/44] [DELTA-OSS-EXTERNAL] Improved Delta concurrency with finer-grained conflict detection in OptTxnImpl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a modified PR from the original PR https://github.com/delta-io/delta/pull/114 by `tomasbartalos` (kudos, it was a very good PR!). This PR tracks transaction changes at a finer granularity (no new columns required in RemoveFile action) thus allowing more concurrent operations to succeed. closes delta-io/delta#228 and delta-io/delta#72 This PR improves the conflict detection logic in OptTxn using the following strategy. - OptTxn tracks two additional things - All the partitions read by the query using the OptTxn - All the files read by the query - When committing a txn, it checks this txn's actions against the actions of concurrently committed txns using the following strategy: 1. If any of the concurrently added files are in the partitions read by this txn, then fail because this txn should have read them. -It’s okay for files to have been removed from the partitions read by this txn as long as this txn never read those files. This is checked by the next rule. 2. If any of the files read by this txn have already been removed by concurrent txns, then fail. 3. If any of the files removed by this txn have already been removed by concurrent txns, then fail. - In addition, I have made another change where setting `dataChange` to `false` in all the actions (enabled by #223) will ensure the txn will not conflict with any other concurrent txn based on predicates. Tests written by `tomasbartalos` in the original PR. Some tests were changed because some scenarios that were blocked in the original PR are now allowed, thanks to more granular and permissive conflict detection logic. Some test names tweaked to ensure clarity. GitOrigin-RevId: f02a8f48838f86d256a86cd40241cdbfa74addb4 Lead-authored-by: Tathagata Das Co-authored-by: Tomas Bartalos --- .../spark/sql/delta/DeltaOperations.scala | 1 + .../sql/delta/OptimisticTransaction.scala | 152 ++++- .../spark/sql/delta/isolationLevels.scala | 91 +++ .../delta/OptimisticTransactionSuite.scala | 611 +++++++++++++++++- 4 files changed, 805 insertions(+), 50 deletions(-) create mode 100644 src/main/scala/org/apache/spark/sql/delta/isolationLevels.scala diff --git a/src/main/scala/org/apache/spark/sql/delta/DeltaOperations.scala b/src/main/scala/org/apache/spark/sql/delta/DeltaOperations.scala index 547e87222e2..93e8fe4211a 100644 --- a/src/main/scala/org/apache/spark/sql/delta/DeltaOperations.scala +++ b/src/main/scala/org/apache/spark/sql/delta/DeltaOperations.scala @@ -227,6 +227,7 @@ object DeltaOperations { "newSchema" -> JsonUtils.toJson(newSchema)) } + private def structFieldToMap(colPath: Seq[String], field: StructField): Map[String, Any] = { Map( "name" -> UnresolvedAttribute(colPath :+ field.name).name, diff --git a/src/main/scala/org/apache/spark/sql/delta/OptimisticTransaction.scala b/src/main/scala/org/apache/spark/sql/delta/OptimisticTransaction.scala index 6340063abbb..b81e5d80105 100644 --- a/src/main/scala/org/apache/spark/sql/delta/OptimisticTransaction.scala +++ b/src/main/scala/org/apache/spark/sql/delta/OptimisticTransaction.scala @@ -21,7 +21,7 @@ import java.util.ConcurrentModificationException import java.util.concurrent.TimeUnit.NANOSECONDS import scala.collection.mutable -import scala.collection.mutable.ArrayBuffer +import scala.collection.mutable.{ArrayBuffer, HashSet} import scala.util.control.NonFatal import com.databricks.spark.util.TagDefinitions.TAG_LOG_STORE_CLASS @@ -145,6 +145,15 @@ trait OptimisticTransactionImpl extends TransactionalWrite { /** Tracks the appIds that have been seen by this transaction. */ protected val readTxn = new ArrayBuffer[String] + /** + * Tracks the data that could have been seen by recording the partition + * predicates by which files have been queried by by this transaction. + */ + protected val readPredicates = new ArrayBuffer[Expression] + + /** Tracks specific files that have been seen by this transaction. */ + protected val readFiles = new HashSet[AddFile] + /** Tracks if this transaction has already committed. */ protected var committed = false @@ -155,12 +164,6 @@ trait OptimisticTransactionImpl extends TransactionalWrite { protected var commitStartNano = -1L protected var commitInfo: CommitInfo = _ - /** - * Tracks if this transaction depends on any data files. This flag must be set if this transaction - * reads any data explicitly or implicitly (e.g., delete, update and overwrite). - */ - protected var dependsOnFiles: Boolean = false - /** The version that this transaction is reading from. */ def readVersion: Long = snapshot.version @@ -213,13 +216,18 @@ trait OptimisticTransactionImpl extends TransactionalWrite { /** Returns files matching the given predicates. */ def filterFiles(filters: Seq[Expression]): Seq[AddFile] = { - dependsOnFiles = true - snapshot.filesForScan(Nil, filters).files + val scan = snapshot.filesForScan(Nil, filters) + val partitionFilters = filters.filter { f => + DeltaTableUtils.isPredicatePartitionColumnsOnly(f, metadata.partitionColumns, spark) + } + readPredicates += partitionFilters.reduceLeftOption(And).getOrElse(Literal(true)) + readFiles ++= scan.files + scan.files } /** Mark the entire table as tainted by this transaction. */ def readWholeTable(): Unit = { - dependsOnFiles = true + readPredicates += Literal(true) } /** @@ -246,7 +254,19 @@ trait OptimisticTransactionImpl extends TransactionalWrite { // Try to commit at the next version. var finalActions = prepareCommit(actions, op) + // Find the isolation level to use for this commit + val noDataChanged = actions.collect { case f: FileAction => f.dataChange }.forall(_ == false) + val isolationLevelToUse = if (noDataChanged) { + // If no data has changed (i.e. its is only being rearranged), then SnapshotIsolation + // provides Serializable guarantee. Hence, allow reduced conflict detection by using + // SnapshotIsolation of what the table isolation level is. + SnapshotIsolation + } else { + Serializable + } + val isBlindAppend = { + val dependsOnFiles = readPredicates.nonEmpty || readFiles.nonEmpty val onlyAddFiles = finalActions.collect { case f: FileAction => f }.forall(_.isInstanceOf[AddFile]) onlyAddFiles && !dependsOnFiles @@ -270,7 +290,7 @@ trait OptimisticTransactionImpl extends TransactionalWrite { registerPostCommitHook(GenerateSymlinkManifest) } - val commitVersion = doCommit(snapshot.version + 1, finalActions, 0) + val commitVersion = doCommit(snapshot.version + 1, finalActions, 0, isolationLevelToUse) logInfo(s"Committed delta #$commitVersion to ${deltaLog.logPath}") postCommit(commitVersion, finalActions) commitVersion @@ -358,13 +378,17 @@ trait OptimisticTransactionImpl extends TransactionalWrite { private def doCommit( attemptVersion: Long, actions: Seq[Action], - attemptNumber: Int): Long = deltaLog.lockInterruptibly { + attemptNumber: Int, + isolationLevel: IsolationLevel): Long = deltaLog.lockInterruptibly { try { - logDebug(s"Attempting to commit version $attemptVersion with ${actions.size} actions") + logDebug( + s"Attempting to commit version $attemptVersion with ${actions.size} actions with " + + s"$isolationLevel isolation level") deltaLog.store.write( deltaFile(deltaLog.logPath, attemptVersion), actions.map(_.json).toIterator) + val commitTime = System.nanoTime() val postCommitSnapshot = deltaLog.update() if (postCommitSnapshot.version < attemptVersion) { @@ -406,7 +430,7 @@ trait OptimisticTransactionImpl extends TransactionalWrite { attemptVersion } catch { case e: java.nio.file.FileAlreadyExistsException => - checkAndRetry(attemptVersion, actions, attemptNumber) + checkAndRetry(attemptVersion, actions, attemptNumber, isolationLevel) } } @@ -418,22 +442,38 @@ trait OptimisticTransactionImpl extends TransactionalWrite { protected def checkAndRetry( checkVersion: Long, actions: Seq[Action], - attemptNumber: Int): Long = recordDeltaOperation( + attemptNumber: Int, + commitIsolationLevel: IsolationLevel): Long = recordDeltaOperation( deltaLog, "delta.commit.retry", tags = Map(TAG_LOG_STORE_CLASS -> deltaLog.store.getClass.getName)) { - deltaLog.update() - val nextAttempt = deltaLog.snapshot.version + 1 - (checkVersion until nextAttempt).foreach { version => + import _spark.implicits._ + + val nextAttemptVersion = getNextAttemptVersion(checkVersion) + (checkVersion until nextAttemptVersion).foreach { version => + // Actions of a commit which went in before ours val winningCommitActions = deltaLog.store.read(deltaFile(deltaLog.logPath, version)).map(Action.fromJson) + + // Categorize all the actions that have happened since the transaction read. val metadataUpdates = winningCommitActions.collect { case a: Metadata => a } + val removedFiles = winningCommitActions.collect { case a: RemoveFile => a } val txns = winningCommitActions.collect { case a: SetTransaction => a } val protocol = winningCommitActions.collect { case a: Protocol => a } val commitInfo = winningCommitActions.collectFirst { case a: CommitInfo => a }.map( ci => ci.copy(version = Some(version))) - val fileActions = winningCommitActions.collect { case f: FileAction => f } + + val blindAppendAddedFiles = mutable.ArrayBuffer[AddFile]() + val changedDataAddedFiles = mutable.ArrayBuffer[AddFile]() + + val isBlindAppendOption = commitInfo.flatMap(_.isBlindAppend) + if (isBlindAppendOption.getOrElse(false)) { + blindAppendAddedFiles ++= winningCommitActions.collect { case a: AddFile => a } + } else { + changedDataAddedFiles ++= winningCommitActions.collect { case a: AddFile => a } + } + // If the log protocol version was upgraded, make sure we are still okay. // Fail the transaction if we're trying to upgrade protocol ourselves. if (protocol.nonEmpty) { @@ -446,22 +486,86 @@ trait OptimisticTransactionImpl extends TransactionalWrite { case _ => } } + // Fail if the metadata is different than what the txn read. if (metadataUpdates.nonEmpty) { throw new MetadataChangedException(commitInfo) } - // Fail if the data is different than what the txn read. - if (dependsOnFiles && fileActions.nonEmpty) { - throw new ConcurrentWriteException(commitInfo) + + // Fail if new files have been added that the txn should have read. + val addedFilesToCheckForConflicts = commitIsolationLevel match { + case Serializable => changedDataAddedFiles ++ blindAppendAddedFiles + case WriteSerializable => changedDataAddedFiles // don't conflict with blind appends + case SnapshotIsolation => Seq.empty + } + val predicatesMatchingAddedFiles = ExpressionSet(readPredicates).iterator.flatMap { p => + val conflictingFile = DeltaLog.filterFileList( + metadata.partitionColumns, + addedFilesToCheckForConflicts.toDF(), p :: Nil).as[AddFile].take(1) + + conflictingFile.headOption.map(f => getPrettyPartitionMessage(f.partitionValues)) + }.take(1).toArray + + if (predicatesMatchingAddedFiles.nonEmpty) { + val isWriteSerializable = commitIsolationLevel == WriteSerializable + val onlyAddFiles = + winningCommitActions.collect { case f: FileAction => f }.forall(_.isInstanceOf[AddFile]) + + val retryMsg = + if (isWriteSerializable && onlyAddFiles && isBlindAppendOption.isEmpty) { + // This transaction was made by an older version which did not set `isBlindAppend` flag. + // So even if it looks like an append, we don't know for sure if it was a blind append + // or not. So we suggest them to upgrade all there workloads to latest version. + Some( + "Upgrading all your concurrent writers to use the latest Delta Lake may " + + "avoid this error. Please upgrade and then retry this operation again.") + } else None + throw new ConcurrentAppendException(commitInfo, predicatesMatchingAddedFiles.head, retryMsg) + } + + // Fail if files have been deleted that the txn read. + val readFilePaths = readFiles.map(f => f.path -> f.partitionValues).toMap + val deleteReadOverlap = removedFiles.find(r => readFilePaths.contains(r.path)) + if (deleteReadOverlap.nonEmpty) { + val filePath = deleteReadOverlap.get.path + val partition = getPrettyPartitionMessage(readFilePaths(filePath)) + throw new ConcurrentDeleteReadException(commitInfo, s"$filePath in $partition") + } + + // Fail if a file is deleted twice. + val txnDeletes = actions.collect { case r: RemoveFile => r }.map(_.path).toSet + val deleteOverlap = removedFiles.map(_.path).toSet intersect txnDeletes + if (deleteOverlap.nonEmpty) { + throw new ConcurrentDeleteDeleteException(commitInfo, deleteOverlap.head) } + // Fail if idempotent transactions have conflicted. val txnOverlap = txns.map(_.appId).toSet intersect readTxn.toSet if (txnOverlap.nonEmpty) { throw new ConcurrentTransactionException(commitInfo) } } - logInfo(s"No logical conflicts with deltas [$checkVersion, $nextAttempt), retrying.") - doCommit(nextAttempt, actions, attemptNumber + 1) + + logInfo(s"No logical conflicts with deltas [$checkVersion, $nextAttemptVersion), retrying.") + doCommit(nextAttemptVersion, actions, attemptNumber + 1, commitIsolationLevel) + } + + /** Returns the next attempt version given the last attempted version */ + protected def getNextAttemptVersion(previousAttemptVersion: Long): Long = { + deltaLog.update() + deltaLog.snapshot.version + 1 + } + + /** A helper function for pretty printing a specific partition directory. */ + protected def getPrettyPartitionMessage(partitionValues: Map[String, String]): String = { + if (metadata.partitionColumns.isEmpty) { + "the root of the table" + } else { + val partition = metadata.partitionColumns.map { name => + s"$name=${partitionValues(name)}" + }.mkString("[", ", ", "]") + s"partition ${partition}" + } } /** Register a hook that will be executed once a commit is successful. */ diff --git a/src/main/scala/org/apache/spark/sql/delta/isolationLevels.scala b/src/main/scala/org/apache/spark/sql/delta/isolationLevels.scala new file mode 100644 index 00000000000..a0f666f8f8b --- /dev/null +++ b/src/main/scala/org/apache/spark/sql/delta/isolationLevels.scala @@ -0,0 +1,91 @@ +/* + * Copyright 2019 Databricks, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.spark.sql.delta + +/** + * Trait that defines the level consistency guarantee is going to be provided by + * `OptimisticTransaction.commit()`. [[Serializable]] is the most + * strict level and [[SnapshotIsolation]] is the least strict one. + * + * @see [[IsolationLevel.allLevelsInDescOrder]] for all the levels in the descending order + * of strictness and [[IsolationLevel.DEFAULT]] for the default table isolation level. + */ +sealed trait IsolationLevel { + override def toString: String = this.getClass.getSimpleName.stripSuffix("$") +} + +/** + * This isolation level will ensure serializability between all read and write operations. + * Specifically, for write operations, this mode will ensure that the result of + * the table will be perfectly consistent with the visible history of operations, that is, + * as if all the operations were executed sequentially one by one. + */ +case object Serializable extends IsolationLevel + +/** + * This isolation level will ensure snapshot isolation consistency guarantee between write + * operations only. In other words, if only the write operations are considered, then + * there exists a serializable sequence between them that would produce the same result + * as seen in the table. However, if both read and write operations are considered, then + * there may not exist a serializable sequence that would explain all the observed reads. + * + * This provides a lower consistency guarantee than [[Serializable]] but a higher + * availability than that. For example, unlike [[Serializable]], this level allows an UPDATE + * operation to be committed even if there was a concurrent INSERT operation that has already + * added data that should have been read by the UPDATE. It will be as if the UPDATE was executed + * before the INSERT even if the former was committed after the latter. As a side effect, + * the visible history of operations may not be consistent with the + * result expected if these operations were executed sequentially one by one. + */ +case object WriteSerializable extends IsolationLevel + +/** + * This isolation level will ensure that all reads will see a consistent + * snapshot of the table and any transactional write will successfully commit only + * if the values updated by the transaction have not been changed externally since + * the snapshot was read by the transaction. + * + * This provides a lower consistency guarantee than [[WriteSerializable]] but a higher + * availability than that. For example, unlike [[WriteSerializable]], this level allows two + * concurrent UPDATE operations reading the same data to be committed successfully as long as + * they don't modify the same data. + * + * Note that for operations that do not modify data in the table, Snapshot isolation is same + * as Serializablity. Hence such operations can be safely committed with Snapshot isolation level. + */ +case object SnapshotIsolation extends IsolationLevel + + +object IsolationLevel { + + val DEFAULT = WriteSerializable + + /** All possible isolation levels in descending order of guarantees provided */ + val allLevelsInDescOrder: Seq[IsolationLevel] = Seq( + Serializable, + WriteSerializable, + SnapshotIsolation) + + /** All the valid isolation levels that can be specified as the table isolation level */ + val validTableIsolationLevels = Set[IsolationLevel](Serializable, WriteSerializable) + + def fromString(s: String): IsolationLevel = { + allLevelsInDescOrder.find(_.toString.equalsIgnoreCase(s)).getOrElse { + throw new IllegalArgumentException(s"invalid isolation level '$s'") + } + } +} diff --git a/src/test/scala/org/apache/spark/sql/delta/OptimisticTransactionSuite.scala b/src/test/scala/org/apache/spark/sql/delta/OptimisticTransactionSuite.scala index 97994439d91..bc2bfcaec16 100644 --- a/src/test/scala/org/apache/spark/sql/delta/OptimisticTransactionSuite.scala +++ b/src/test/scala/org/apache/spark/sql/delta/OptimisticTransactionSuite.scala @@ -16,13 +16,16 @@ package org.apache.spark.sql.delta -import org.apache.spark.sql.delta.DeltaOperations.Truncate -import org.apache.spark.sql.delta.actions.{AddFile, Metadata, SetTransaction} +import java.util.ConcurrentModificationException + +import org.apache.spark.sql.delta.DeltaOperations.{Delete, ManualUpdate, Truncate} +import org.apache.spark.sql.delta.actions.{Action, AddFile, FileAction, Metadata, RemoveFile, SetTransaction} import org.apache.hadoop.fs.Path import org.apache.spark.sql.{QueryTest, Row} import org.apache.spark.sql.execution.FileSourceScanExec import org.apache.spark.sql.test.SharedSparkSession +import org.apache.spark.sql.types.{StringType, StructField, StructType} class OptimisticTransactionSuite extends QueryTest with SharedSparkSession { private val addA = AddFile("a", Map.empty, 1, 1, dataChange = true) @@ -34,14 +37,14 @@ class OptimisticTransactionSuite extends QueryTest with SharedSparkSession { test("block append against metadata change") { withTempDir { tempDir => val log = DeltaLog(spark, new Path(tempDir.getCanonicalPath)) - // Initialize the log. Truncate() is just a no-op placeholder. - log.startTransaction().commit(Nil, Truncate()) + // Initialize the log. ManualUpdate is just a no-op placeholder. + log.startTransaction().commit(Nil, ManualUpdate) val txn = log.startTransaction() val winningTxn = log.startTransaction() - winningTxn.commit(Metadata() :: Nil, Truncate()) + winningTxn.commit(Metadata() :: Nil, ManualUpdate) intercept[MetadataChangedException] { - txn.commit(addA :: Nil, Truncate()) + txn.commit(addA :: Nil, ManualUpdate) } } } @@ -49,17 +52,17 @@ class OptimisticTransactionSuite extends QueryTest with SharedSparkSession { test("block read+append against append") { withTempDir { tempDir => val log = DeltaLog(spark, new Path(tempDir.getCanonicalPath)) - // Initialize the log. Truncate() is just a no-op placeholder. - log.startTransaction().commit(Metadata() :: Nil, Truncate()) + // Initialize the log. ManualUpdate is just a no-op placeholder. + log.startTransaction().commit(Metadata() :: Nil, ManualUpdate) val txn = log.startTransaction() // reads the table txn.filterFiles() val winningTxn = log.startTransaction() - winningTxn.commit(addA :: Nil, Truncate()) + winningTxn.commit(addA :: Nil, ManualUpdate) // TODO: intercept a more specific exception intercept[DeltaConcurrentModificationException] { - txn.commit(addB :: Nil, Truncate()) + txn.commit(addB :: Nil, ManualUpdate) } } } @@ -67,13 +70,13 @@ class OptimisticTransactionSuite extends QueryTest with SharedSparkSession { test("allow blind-append against any data change") { withTempDir { tempDir => val log = DeltaLog(spark, new Path(tempDir.getCanonicalPath)) - // Initialize the log and add data. Truncate() is just a no-op placeholder. - log.startTransaction().commit(addA :: Nil, Truncate()) + // Initialize the log and add data. ManualUpdate is just a no-op placeholder. + log.startTransaction().commit(addA :: Nil, ManualUpdate) val txn = log.startTransaction() val winningTxn = log.startTransaction() - winningTxn.commit(addA.remove :: addB :: Nil, Truncate()) - txn.commit(addC :: Nil, Truncate()) + winningTxn.commit(addA.remove :: addB :: Nil, ManualUpdate) + txn.commit(addC :: Nil, ManualUpdate) checkAnswer(log.update().allFiles.select("path"), Row("b") :: Row("c") :: Nil) } } @@ -81,29 +84,585 @@ class OptimisticTransactionSuite extends QueryTest with SharedSparkSession { test("allow read+append+delete against no data change") { withTempDir { tempDir => val log = DeltaLog(spark, new Path(tempDir.getCanonicalPath)) - // Initialize the log and add data. Truncate() is just a no-op placeholder. - log.startTransaction().commit(addA :: Nil, Truncate()) + // Initialize the log and add data. ManualUpdate is just a no-op placeholder. + log.startTransaction().commit(addA :: Nil, ManualUpdate) val txn = log.startTransaction() txn.filterFiles() val winningTxn = log.startTransaction() - winningTxn.commit(Nil, Truncate()) - txn.commit(addA.remove :: addB :: Nil, Truncate()) + winningTxn.commit(Nil, ManualUpdate) + txn.commit(addA.remove :: addB :: Nil, ManualUpdate) checkAnswer(log.update().allFiles.select("path"), Row("b") :: Nil) } } + + val A_P1 = "part=1/a" + val B_P1 = "part=1/b" + val C_P1 = "part=1/c" + val C_P2 = "part=2/c" + val D_P2 = "part=2/d" + val E_P3 = "part=3/e" + val F_P3 = "part=3/f" + val G_P4 = "part=4/g" + + private val addA_P1 = AddFile(A_P1, Map("part" -> "1"), 1, 1, dataChange = true) + private val addB_P1 = AddFile(B_P1, Map("part" -> "1"), 1, 1, dataChange = true) + private val addC_P1 = AddFile(C_P1, Map("part" -> "1"), 1, 1, dataChange = true) + private val addC_P2 = AddFile(C_P2, Map("part" -> "2"), 1, 1, dataChange = true) + private val addD_P2 = AddFile(D_P2, Map("part" -> "2"), 1, 1, dataChange = true) + private val addE_P3 = AddFile(E_P3, Map("part" -> "3"), 1, 1, dataChange = true) + private val addF_P3 = AddFile(F_P3, Map("part" -> "3"), 1, 1, dataChange = true) + private val addG_P4 = AddFile(G_P4, Map("part" -> "4"), 1, 1, dataChange = true) + + test("allow concurrent commit on disjoint partitions") { + withLog(addA_P1 :: addE_P3 :: Nil) { log => + val tx1 = log.startTransaction() + // TX1 reads P3 (but not P1) + val tx1Read = tx1.filterFiles(('part === 3).expr :: Nil) + assert(tx1Read.map(_.path) == E_P3 :: Nil) + + val tx2 = log.startTransaction() + tx2.filterFiles() + // TX2 modifies only P1 + tx2.commit(addB_P1 :: Nil, ManualUpdate) + + // free to commit because P1 modified by TX2 was not read + tx1.commit(addC_P2 :: addE_P3.remove :: Nil, ManualUpdate) + checkAnswer( + log.update().allFiles.select("path"), + Row(A_P1) :: // start (E_P3 was removed by TX1) + Row(B_P1) :: // TX2 + Row(C_P2) :: Nil) // TX1 + } + } + + test("allow concurrent commit on disjoint partitions reading all partitions") { + withLog(addA_P1 :: addD_P2 :: Nil) { log => + val tx1 = log.startTransaction() + // TX1 read P1 + tx1.filterFiles(('part isin 1).expr :: Nil) + + val tx2 = log.startTransaction() + tx2.filterFiles() + tx2.commit(addC_P2 :: addD_P2.remove :: Nil, ManualUpdate) + + tx1.commit(addE_P3 :: addF_P3 :: Nil, ManualUpdate) + + checkAnswer( + log.update().allFiles.select("path"), + Row(A_P1) :: // start + Row(C_P2) :: // TX2 + Row(E_P3) :: Row(F_P3) :: Nil) // TX1 + } + } + + test("block concurrent commit when read partition was appended to by concurrent write") { + withLog(addA_P1 :: addD_P2 :: addE_P3 :: Nil) { log => + val tx1 = log.startTransaction() + // TX1 reads only P1 + val tx1Read = tx1.filterFiles(('part === 1).expr :: Nil) + assert(tx1Read.map(_.path) == A_P1 :: Nil) + + val tx2 = log.startTransaction() + tx2.filterFiles() + // TX2 modifies only P1 + tx2.commit(addB_P1 :: Nil, ManualUpdate) + + intercept[ConcurrentAppendException] { + // P1 was modified + tx1.commit(addC_P2 :: addE_P3 :: Nil, ManualUpdate) + } + } + } + + test("block concurrent commit on full table scan") { + withLog(addA_P1 :: addD_P2 :: Nil) { log => + val tx1 = log.startTransaction() + // TX1 full table scan + tx1.filterFiles() + tx1.filterFiles(('part === 1).expr :: Nil) + + val tx2 = log.startTransaction() + tx2.filterFiles() + tx2.commit(addC_P2 :: addD_P2.remove :: Nil, ManualUpdate) + + intercept[ConcurrentAppendException] { + tx1.commit(addE_P3 :: addF_P3 :: Nil, ManualUpdate) + } + } + } + + val A_1_1 = "a=1/b=1/a" + val B_1_2 = "a=1/b=2/b" + val C_2_1 = "a=2/b=1/c" + val D_3_1 = "a=3/b=1/d" + + val addA_1_1_nested = AddFile( + A_1_1, Map("a" -> "1", "b" -> "1"), + 1, 1, dataChange = true) + val addB_1_2_nested = AddFile( + B_1_2, Map("a" -> "1", "b" -> "2"), + 1, 1, dataChange = true) + val addC_2_1_nested = AddFile( + C_2_1, Map("a" -> "2", "b" -> "1"), + 1, 1, dataChange = true) + val addD_3_1_nested = AddFile( + D_3_1, Map("a" -> "3", "b" -> "1"), + 1, 1, dataChange = true) + + test("allow concurrent adds to disjoint nested partitions when read is disjoint from write") { + withLog(addA_1_1_nested :: Nil, partitionCols = "a" :: "b" :: Nil) { log => + val tx1 = log.startTransaction() + // TX1 reads a=1/b=1 + val tx1Read = tx1.filterFiles(('a === 1 and 'b === 1).expr :: Nil) + assert(tx1Read.map(_.path) == A_1_1 :: Nil) + + val tx2 = log.startTransaction() + tx2.filterFiles() + // TX2 reads all partitions and modifies only a=1/b=2 + tx2.commit(addB_1_2_nested :: Nil, ManualUpdate) + + // TX1 reads a=1/b=1 which was not modified by TX2, hence TX1 can write to a=2/b=1 + tx1.commit(addC_2_1_nested :: Nil, ManualUpdate) + checkAnswer( + log.update().allFiles.select("path"), + Row(A_1_1) :: // start + Row(B_1_2) :: // TX2 + Row(C_2_1) :: Nil) // TX1 + } + } + + test("allow concurrent adds to same nested partitions when read is disjoint from write") { + withLog(addA_1_1_nested :: Nil, partitionCols = "a" :: "b" :: Nil) { log => + val tx1 = log.startTransaction() + // TX1 reads a=1/b=1 + val tx1Read = tx1.filterFiles(('a === 1 and 'b === 1).expr :: Nil) + assert(tx1Read.map(_.path) == A_1_1 :: Nil) + + val tx2 = log.startTransaction() + tx2.filterFiles() + // TX2 modifies a=1/b=2 + tx2.commit(addB_1_2_nested :: Nil, ManualUpdate) + + // TX1 reads a=1/b=1 which was not modified by TX2, hence TX1 can write to a=2/b=1 + val add = AddFile( + "a=1/b=2/x", Map("a" -> "1", "b" -> "2"), + 1, 1, dataChange = true) + tx1.commit(add :: Nil, ManualUpdate) + checkAnswer( + log.update().allFiles.select("path"), + Row(A_1_1) :: // start + Row(B_1_2) :: // TX2 + Row("a=1/b=2/x") :: Nil) // TX1 + } + } + + test("allow concurrent add when read at lvl1 partition is disjoint from concur. write at lvl2") { + withLog( + addA_1_1_nested :: addB_1_2_nested :: Nil, + partitionCols = "a" :: "b" :: Nil) { log => + val tx1 = log.startTransaction() + // TX1 reads a=1 + val tx1Read = tx1.filterFiles(('a === 1).expr :: Nil) + assert(tx1Read.map(_.path).toSet == Set(A_1_1, B_1_2)) + + val tx2 = log.startTransaction() + tx2.filterFiles() + // TX2 modifies only a=2/b=1 + tx2.commit(addC_2_1_nested :: Nil, ManualUpdate) + + // free to commit a=2/b=1 + tx1.commit(addD_3_1_nested :: Nil, ManualUpdate) + checkAnswer( + log.update().allFiles.select("path"), + Row(A_1_1) :: Row(B_1_2) :: // start + Row(C_2_1) :: // TX2 + Row(D_3_1) :: Nil) // TX1 + } + } + + test("block commit when read at lvl1 partition reads lvl2 file concur. deleted") { + withLog( + addA_1_1_nested :: addB_1_2_nested :: Nil, + partitionCols = "a" :: "b" :: Nil) { log => + + val tx1 = log.startTransaction() + // TX1 reads a=1 + val tx1Read = tx1.filterFiles(('a === 1).expr :: Nil) + assert(tx1Read.map(_.path).toSet == Set(A_1_1, B_1_2)) + + val tx2 = log.startTransaction() + tx2.filterFiles() + // TX2 modifies a=1/b=1 + tx2.commit(addA_1_1_nested.remove :: Nil, ManualUpdate) + + intercept[ConcurrentDeleteReadException] { + // TX2 modified a=1, which was read by TX1 + tx1.commit(addD_3_1_nested :: Nil, ManualUpdate) + } + } + } + + test("block commit when full table read conflicts with concur. write in lvl2 nested partition") { + withLog(addA_1_1_nested :: Nil, partitionCols = "a" :: "b" :: Nil) { log => + val tx1 = log.startTransaction() + // TX1 full table scan + tx1.filterFiles() + + val tx2 = log.startTransaction() + tx2.filterFiles() + // TX2 modifies only a=1/b=2 + tx2.commit(addB_1_2_nested :: Nil, ManualUpdate) + + intercept[ConcurrentAppendException] { + // TX2 modified table all of which was read by TX1 + tx1.commit(addC_2_1_nested :: Nil, ManualUpdate) + } + } + } + + test("block commit when part. range read conflicts with concur. write in lvl2 nested partition") { + withLog( + addA_1_1_nested :: Nil, + partitionCols = "a" :: "b" :: Nil) { log => + + val tx1 = log.startTransaction() + // TX1 reads multiple nested partitions a >= 1 or b > 1 + val tx1Read = tx1.filterFiles(('a >= 1 or 'b > 1).expr :: Nil) + assert(tx1Read.map(_.path).toSet == Set(A_1_1)) + + val tx2 = log.startTransaction() + tx2.filterFiles() + // TX2 modifies a=1/b=2 + tx2.commit(addB_1_2_nested :: Nil, ManualUpdate) + + intercept[ConcurrentAppendException] { + // partition a=1/b=2 conflicts with our read a >= 1 or 'b > 1 + tx1.commit(addD_3_1_nested :: Nil, ManualUpdate) + } + } + } + + test("block commit with concurrent removes on same file") { + withLog(addB_1_2_nested :: Nil, partitionCols = "a" :: "b" :: Nil) { log => + val tx1 = log.startTransaction() + // TX1 reads a=2 so that read is disjoint with write partition. + tx1.filterFiles(('a === 2).expr :: Nil) + + val tx2 = log.startTransaction() + tx2.filterFiles() + // TX2 modifies a=1/b=2 + tx2.commit(addB_1_2_nested.remove :: Nil, ManualUpdate) + + intercept[ConcurrentDeleteDeleteException] { + // TX1 read does not conflict with TX2 as disjoint partitions + // But TX2 removed the same file that TX1 is trying to remove + tx1.commit(addB_1_2_nested.remove:: Nil, ManualUpdate) + } + } + } + + test("block commit when full table read conflicts with add in any partition") { + withLog(addA_P1 :: Nil) { log => + val tx1 = log.startTransaction() + tx1.filterFiles() + + val tx2 = log.startTransaction() + tx2.filterFiles() + tx2.commit(addC_P2.remove :: addB_P1 :: Nil, ManualUpdate) + + intercept[ConcurrentAppendException] { + // TX1 read whole table but TX2 concurrently modified partition P2 + tx1.commit(addD_P2 :: Nil, ManualUpdate) + } + } + } + + test("block commit when full table read conflicts with delete in any partition") { + withLog(addA_P1 :: addC_P2 :: Nil) { log => + val tx1 = log.startTransaction() + tx1.filterFiles() + + val tx2 = log.startTransaction() + tx2.filterFiles() + tx2.commit(addA_P1.remove :: Nil, ManualUpdate) + + intercept[ConcurrentDeleteReadException] { + // TX1 read whole table but TX2 concurrently modified partition P1 + tx1.commit(addB_P1.remove :: Nil, ManualUpdate) + } + } + } + + test("block concurrent replaceWhere initial empty") { + withLog(addA_P1 :: Nil) { log => + val tx1 = log.startTransaction() + // replaceWhere (part >= 2) -> empty read + val tx1Read = tx1.filterFiles(('part >= 2).expr :: Nil) + assert(tx1Read.isEmpty) + + val tx2 = log.startTransaction() + // replaceWhere (part >= 2) -> empty read + val tx2Read = tx2.filterFiles(('part >= 2).expr :: Nil) + assert(tx2Read.isEmpty) + tx2.commit(addE_P3 :: Nil, ManualUpdate) + + intercept[ConcurrentAppendException] { + // Tx2 have modified P2 which conflicts with our read (part >= 2) + tx1.commit(addC_P2 :: Nil, ManualUpdate) + } + } + } + + test("allow concurrent replaceWhere disjoint partitions initial empty") { + withLog(addA_P1 :: Nil) { log => + val tx1 = log.startTransaction() + // replaceWhere (part > 2 and part <= 3) -> empty read + val tx1Read = tx1.filterFiles(('part > 1 and 'part <= 3).expr :: Nil) + assert(tx1Read.isEmpty) + + val tx2 = log.startTransaction() + // replaceWhere (part > 3) -> empty read + val tx2Read = tx2.filterFiles(('part > 3).expr :: Nil) + assert(tx2Read.isEmpty) + + tx1.commit(addC_P2 :: Nil, ManualUpdate) + // P2 doesn't conflict with read predicate (part > 3) + tx2.commit(addG_P4 :: Nil, ManualUpdate) + checkAnswer( + log.update().allFiles.select("path"), + Row(A_P1) :: // start + Row(C_P2) :: // TX1 + Row(G_P4) :: Nil) // TX2 + } + } + + test("block concurrent replaceWhere NOT empty but conflicting predicate") { + withLog(addA_P1 :: addG_P4 :: Nil) { log => + val tx1 = log.startTransaction() + // replaceWhere (part <= 3) -> read P1 + val tx1Read = tx1.filterFiles(('part <= 3).expr :: Nil) + assert(tx1Read.map(_.path) == A_P1 :: Nil) + val tx2 = log.startTransaction() + // replaceWhere (part >= 2) -> read P4 + val tx2Read = tx2.filterFiles(('part >= 2).expr :: Nil) + assert(tx2Read.map(_.path) == G_P4 :: Nil) + + tx1.commit(addA_P1.remove :: addC_P2 :: Nil, ManualUpdate) + intercept[ConcurrentAppendException] { + // Tx1 have modified P2 which conflicts with our read (part >= 2) + tx2.commit(addG_P4.remove :: addE_P3 :: Nil, ManualUpdate) + } + } + } + + test("block concurrent commit on read & add conflicting partitions") { + withLog(addA_P1 :: Nil) { log => + val tx1 = log.startTransaction() + // read P1 + val tx1Read = tx1.filterFiles(('part === 1).expr :: Nil) + assert(tx1Read.map(_.path) == A_P1 :: Nil) + + // tx2 commits before tx1 + val tx2 = log.startTransaction() + tx2.filterFiles() + tx2.commit(addB_P1 :: Nil, ManualUpdate) + + intercept[ConcurrentAppendException] { + // P1 read by TX1 was modified by TX2 + tx1.commit(addE_P3 :: Nil, ManualUpdate) + } + } + } + + test("block concurrent commit on read & delete conflicting partitions") { + withLog(addA_P1 :: addB_P1 :: Nil) { log => + val tx1 = log.startTransaction() + // read P1 + tx1.filterFiles(('part === 1).expr :: Nil) + + // tx2 commits before tx1 + val tx2 = log.startTransaction() + tx2.filterFiles() + tx2.commit(addA_P1.remove :: Nil, ManualUpdate) + + intercept[ConcurrentDeleteReadException] { + // P1 read by TX1 was removed by TX2 + tx1.commit(addE_P3 :: Nil, ManualUpdate) + } + } + } + + test("block 2 concurrent replaceWhere transactions") { + withLog(addA_P1 :: Nil) { log => + val tx1 = log.startTransaction() + // read P1 + tx1.filterFiles(('part === 1).expr :: Nil) + + val tx2 = log.startTransaction() + // read P1 + tx2.filterFiles(('part === 1).expr :: Nil) + + // tx1 commits before tx2 + tx1.commit(addA_P1.remove :: addB_P1 :: Nil, ManualUpdate) + + intercept[ConcurrentAppendException] { + // P1 read & deleted by TX1 is being modified by TX2 + tx2.commit(addA_P1.remove :: addC_P1 :: Nil, ManualUpdate) + } + } + } + + test("block 2 concurrent replaceWhere transactions changing partitions") { + withLog(addA_P1 :: addC_P2 :: addE_P3 :: Nil) { log => + val tx1 = log.startTransaction() + // read P3 + tx1.filterFiles(('part === 3 or 'part === 1).expr :: Nil) + + val tx2 = log.startTransaction() + // read P3 + tx2.filterFiles(('part === 3 or 'part === 2).expr :: Nil) + + // tx1 commits before tx2 + tx1.commit(addA_P1.remove :: addE_P3.remove :: addB_P1 :: Nil, ManualUpdate) + + intercept[ConcurrentDeleteReadException] { + // P3 read & deleted by TX1 is being modified by TX2 + tx2.commit(addC_P2.remove :: addE_P3.remove :: addD_P2 :: Nil, ManualUpdate) + } + } + } + + test("block concurrent full table scan after concurrent write completes") { + withLog(addA_P1 :: addC_P2 :: addE_P3 :: Nil) { log => + val tx1 = log.startTransaction() + + val tx2 = log.startTransaction() + tx2.filterFiles() + tx2.commit(addC_P2 :: Nil, ManualUpdate) + + tx1.filterFiles(('part === 1).expr :: Nil) + // full table scan + tx1.filterFiles() + + intercept[ConcurrentAppendException] { + tx1.commit(addA_P1.remove :: Nil, ManualUpdate) + } + } + } + + test("block concurrent commit mixed metadata and data predicate") { + withLog(addA_P1 :: addC_P2 :: addE_P3 :: Nil) { log => + val tx1 = log.startTransaction() + + val tx2 = log.startTransaction() + tx2.filterFiles() + tx2.commit(addC_P2 :: Nil, ManualUpdate) + + // actually a full table scan + tx1.filterFiles(('part === 1 or 'year > 2019).expr :: Nil) + + intercept[ConcurrentAppendException] { + tx1.commit(addA_P1.remove :: Nil, ManualUpdate) + } + } + } + + test("block concurrent read (2 scans) and add when read partition was changed by concur. write") { + withLog(addA_P1 :: addE_P3 :: Nil) { log => + val tx1 = log.startTransaction() + tx1.filterFiles(('part === 1).expr :: Nil) + + val tx2 = log.startTransaction() + tx2.filterFiles() + tx2.commit(addC_P2 :: Nil, ManualUpdate) + + tx1.filterFiles(('part > 1 and 'part < 3).expr :: Nil) + + intercept[ConcurrentAppendException] { + // P2 added by TX2 conflicts with our read condition 'part > 1 and 'part < 3 + tx1.commit(addA_P1.remove :: Nil, ManualUpdate) + } + } + } + + def setDataChangeFalse(fileActions: Seq[FileAction]): Seq[FileAction] = { + fileActions.map { + case a: AddFile => a.copy(dataChange = false) + case r: RemoveFile => r.copy(dataChange = false) + } + } + + test("no data change: allow data rearrange when new files concurrently added") { + withLog(addA_P1 :: addB_P1 :: Nil) { log => + val tx1 = log.startTransaction() + tx1.filterFiles() + + val tx2 = log.startTransaction() + tx2.filterFiles() + tx2.commit( + addE_P3 :: Nil, + ManualUpdate) + + // tx1 rearranges files + tx1.commit( + setDataChangeFalse(addA_P1.remove :: addB_P1.remove :: addC_P1 :: Nil), + ManualUpdate) + + checkAnswer( + log.update().allFiles.select("path"), + Row(C_P1) :: Row(E_P3) :: Nil) + } + } + + test("no data change: block data rearrange when concurrently delete removes same file") { + withLog(addA_P1 :: addB_P1 :: Nil) { log => + val tx1 = log.startTransaction() + tx1.filterFiles() + + // tx2 removes file + val tx2 = log.startTransaction() + tx2.filterFiles() + tx2.commit(addA_P1.remove :: Nil, ManualUpdate) + + intercept[ConcurrentDeleteReadException] { + // tx1 reads to rearrange the same file that tx2 deleted + tx1.commit( + setDataChangeFalse(addA_P1.remove :: addB_P1.remove :: addC_P1 :: Nil), + ManualUpdate) + } + } + } + + def withLog( + actions: Seq[Action], + partitionCols: Seq[String] = "part" :: Nil)( + test: DeltaLog => Unit): Unit = { + + val schema = new StructType(partitionCols.map(p => new StructField(p, StringType)).toArray) + var actionWithMetaData = + actions :+ Metadata(partitionColumns = partitionCols, schemaString = schema.json) + + withTempDir { tempDir => + val log = DeltaLog(spark, new Path(tempDir.getCanonicalPath)) + // Initialize the log and add data. ManualUpdate is just a no-op placeholder. + log.startTransaction().commit(actionWithMetaData, ManualUpdate) + test(log) + } + } + test("allow concurrent set-txns with different app ids") { withTempDir { tempDir => val log = DeltaLog(spark, new Path(tempDir.getCanonicalPath)) - // Initialize the log and add data. Truncate() is just a no-op placeholder. - log.startTransaction().commit(Nil, Truncate()) + // Initialize the log and add data. ManualUpdate is just a no-op placeholder. + log.startTransaction().commit(Nil, ManualUpdate) val txn = log.startTransaction() txn.txnVersion("t1") val winningTxn = log.startTransaction() - winningTxn.commit(SetTransaction("t2", 1, Some(1234L)) :: Nil, Truncate()) - txn.commit(Nil, Truncate()) + winningTxn.commit(SetTransaction("t2", 1, Some(1234L)) :: Nil, ManualUpdate) + txn.commit(Nil, ManualUpdate) assert(log.update().transactions === Map("t2" -> 1)) } @@ -112,16 +671,16 @@ class OptimisticTransactionSuite extends QueryTest with SharedSparkSession { test("block concurrent set-txns with the same app id") { withTempDir { tempDir => val log = DeltaLog(spark, new Path(tempDir.getCanonicalPath)) - // Initialize the log and add data. Truncate() is just a no-op placeholder. - log.startTransaction().commit(Nil, Truncate()) + // Initialize the log and add data. ManualUpdate is just a no-op placeholder. + log.startTransaction().commit(Nil, ManualUpdate) val txn = log.startTransaction() txn.txnVersion("t1") val winningTxn = log.startTransaction() - winningTxn.commit(SetTransaction("t1", 1, Some(1234L)) :: Nil, Truncate()) + winningTxn.commit(SetTransaction("t1", 1, Some(1234L)) :: Nil, ManualUpdate) intercept[ConcurrentTransactionException] { - txn.commit(Nil, Truncate()) + txn.commit(Nil, ManualUpdate) } } } From 811f950e6d3270eb7d632f949f9fe83b1f885c16 Mon Sep 17 00:00:00 2001 From: Pranav Anand Date: Tue, 10 Dec 2019 02:46:19 +0000 Subject: [PATCH 24/44] [SC-25510] Update merge error message to clarify the duplicate source key issue - No behavior change is a part of this PR - Change error message to be more verbose when merge fails - It seems that people think the previous error message was a bug in Delta rather than something that needs to be fixed on their end - the new error message should make this clear as well - Should consider adding a feature flag which, when enabled, gives table specific information about the merge like which source rows match target rows Existing tests Author: Pranav Anand GitOrigin-RevId: 44a77c5c5fb5463428855991deba3a7a33bce83f --- .../org/apache/spark/sql/delta/DeltaErrors.scala | 14 +++++++++++--- .../sql/delta/commands/MergeIntoCommand.scala | 2 +- .../spark/sql/delta/MergeIntoSuiteBase.scala | 3 ++- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala b/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala index 4664c1efcb8..11b7bc6d947 100644 --- a/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala +++ b/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala @@ -422,9 +422,17 @@ object DeltaErrors + unknownColumns.mkString(", ")) } - def multipleSourceRowMatchingTargetRowInMergeException: Throwable = { - new UnsupportedOperationException("Cannot perform MERGE as multiple source rows " + - "matched and attempted to update the same target row in the Delta table.") + def multipleSourceRowMatchingTargetRowInMergeException(spark: SparkSession): Throwable = { + new UnsupportedOperationException( + s"""Cannot perform MERGE as multiple source rows matched and attempted to update the same + |target row in the Delta table. By SQL semantics of merge, when multiple source rows match + |on the same target row, the update operation is ambiguous as it is unclear which source + |should be used to update the matching target row. + |You can preprocess the source table to eliminate the possibility of multiple matches. + |Please refer to + |${baseDocsPath(spark)}/delta/delta-update.html#upsert-into-a-table-using-merge + """.stripMargin + ) } def subqueryNotSupportedException(op: String, cond: Expression): Throwable = { diff --git a/src/main/scala/org/apache/spark/sql/delta/commands/MergeIntoCommand.scala b/src/main/scala/org/apache/spark/sql/delta/commands/MergeIntoCommand.scala index a33d63ef54c..5cbf603c801 100644 --- a/src/main/scala/org/apache/spark/sql/delta/commands/MergeIntoCommand.scala +++ b/src/main/scala/org/apache/spark/sql/delta/commands/MergeIntoCommand.scala @@ -222,7 +222,7 @@ case class MergeIntoCommand( // Calculate frequency of matches per source row val matchedRowCounts = collectTouchedFiles.groupBy(ROW_ID_COL).agg(sum("one").as("count")) if (matchedRowCounts.filter("count > 1").count() != 0) { - throw DeltaErrors.multipleSourceRowMatchingTargetRowInMergeException + throw DeltaErrors.multipleSourceRowMatchingTargetRowInMergeException(spark) } // Get the AddFiles using the touched file names. diff --git a/src/test/scala/org/apache/spark/sql/delta/MergeIntoSuiteBase.scala b/src/test/scala/org/apache/spark/sql/delta/MergeIntoSuiteBase.scala index a6d71b9b20d..b765b503287 100644 --- a/src/test/scala/org/apache/spark/sql/delta/MergeIntoSuiteBase.scala +++ b/src/test/scala/org/apache/spark/sql/delta/MergeIntoSuiteBase.scala @@ -487,7 +487,8 @@ abstract class MergeIntoSuiteBase insert = "(key2, value) VALUES (key1 - 10, src.value + 10)") }.toString - assert(e.contains(DeltaErrors.multipleSourceRowMatchingTargetRowInMergeException.getMessage)) + val expectedEx = DeltaErrors.multipleSourceRowMatchingTargetRowInMergeException(spark) + assert(e.contains(expectedEx.getMessage)) } } From 16b3c1765818d4efc8daa429def14912e68fa24d Mon Sep 17 00:00:00 2001 From: Burak Yavuz Date: Tue, 10 Dec 2019 22:46:50 +0000 Subject: [PATCH 25/44] [SC-26711][DELTA] Add exceptions for insert errors - Added a new type of exception, to be used later for DSv2 Author: Burak Yavuz GitOrigin-RevId: 87c2249b1447acee65d3904cf06cb8c89e78f996 --- src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala b/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala index 11b7bc6d947..c1c6027340a 100644 --- a/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala +++ b/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala @@ -150,6 +150,12 @@ object DeltaErrors + newColumns) } + def notEnoughColumnsInInsert(table: String, query: Int, target: Int): Throwable = { + new AnalysisException(s"Cannot write to '$table', not enough data columns; " + + s"target table has ${target} column(s) but the inserted data has " + + s"${query} column(s)") + } + def alterTableReplaceColumnsException( oldSchema: StructType, newSchema: StructType, From 4933f0aac2e6c6d30428bb8ba0bc49caea07305e Mon Sep 17 00:00:00 2001 From: Tathagata Das Date: Thu, 12 Dec 2019 00:58:32 +0000 Subject: [PATCH 26/44] [DELTA-OSS-EXTERNAL] Make the Delta API doc generation script Python 3 compatible - self explanatory - tested locally on python 3 conda environment Closes delta-io/delta#269 Author: Tathagata Das #7263 is resolved by tdas/g2qh6y4y. GitOrigin-RevId: 6091087098803eb14fd0ceeb50eb8a9e947348bc --- docs/generate_api_docs.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/docs/generate_api_docs.py b/docs/generate_api_docs.py index 99f0a77cb7b..b6ca481e1a2 100755 --- a/docs/generate_api_docs.py +++ b/docs/generate_api_docs.py @@ -1,4 +1,4 @@ -# !/usr/bin/env python2 +# !/usr/bin/env python # # Copyright 2019 Databricks, Inc. # Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,6 +13,7 @@ # import os +import sys import subprocess import argparse @@ -38,24 +39,24 @@ def main(): sphinx_docs_final_dir = all_api_docs_final_dir + "/python" # Generate Java and Scala docs - print "## Generating ScalaDoc and JavaDoc ..." + print("## Generating ScalaDoc and JavaDoc ...") with WorkingDirectory(repo_root_dir): run_cmd(["build/sbt", ";clean;unidoc"], stream_output=verbose) # Generate Python docs - print '## Generating Python(Sphinx) docs ...' + print('## Generating Python(Sphinx) docs ...') with WorkingDirectory(sphinx_gen_dir): run_cmd(["make", "html"], stream_output=verbose) # Update Scala docs - print "## Patching ScalaDoc ..." + print("## Patching ScalaDoc ...") with WorkingDirectory(scaladoc_gen_dir): # Patch the js and css files append(docs_root_dir + "/api-docs.js", "./lib/template.js") # append new js functions append(docs_root_dir + "/api-docs.css", "./lib/template.css") # append new styles # Update Java docs - print "## Patching JavaDoc ..." + print("## Patching JavaDoc ...") with WorkingDirectory(javadoc_gen_dir): # Find html files to patch (_, stdout, _) = run_cmd(["find", ".", "-name", "*.html", "-mindepth", "2"]) @@ -99,7 +100,7 @@ def main(): run_cmd(["cp", "-r", javadoc_gen_dir, java_api_docs_final_dir]) run_cmd(["cp", "-r", sphinx_cp_dir, sphinx_docs_final_dir]) - print "## API docs generated in " + all_api_docs_final_dir + print("## API docs generated in " + all_api_docs_final_dir) def run_cmd(cmd, throw_on_error=True, env=None, stream_output=False, **kwargs): @@ -136,6 +137,10 @@ def run_cmd(cmd, throw_on_error=True, env=None, stream_output=False, **kwargs): stderr=subprocess.PIPE, **kwargs) (stdout, stderr) = child.communicate() + if sys.version_info >= (3, 0): + stdout = stdout.decode("UTF-8") + stderr = stderr.decode("UTF-8") + exit_code = child.wait() if throw_on_error and exit_code is not 0: raise Exception( @@ -180,7 +185,7 @@ def __exit__(self, tpe, value, traceback): def log(str): if verbose: - print str + print(str) verbose = False From 89449e820f3eda09a95bfe3054f826480a58f22b Mon Sep 17 00:00:00 2001 From: Pranav Anand Date: Thu, 12 Dec 2019 06:12:07 +0000 Subject: [PATCH 27/44] [SC-26798] Check if documentation links in DeltaErrors point to valid URLs ## What changes were proposed in this pull request? - `DocsPath` now has a method `generateDocsLink` which will be used to create the docs link that is passed to the error message - New test suite to test the doc links in `DeltaErrors` ## How was this patch tested? - `DeltaErrorsSuite` was added - `DeltaErrorsSuiteBase` contains a list of all the error message in `DeltaErrors` that are applicable to Delta. The test accesses each link in each error message and checks to see if the HTTP response is valid for `docs.delta.io.{path}` Author: Pranav Anand #7264 is resolved by pranavanand/pa-docs-fixlinks. GitOrigin-RevId: 24b7353ba335dba4325afbab258f4cdb9f7618a9 --- .../apache/spark/sql/delta/DeltaErrors.scala | 40 ++++++--- .../spark/sql/delta/sources/DeltaSource.scala | 4 +- .../spark/sql/delta/DeltaErrorsSuite.scala | 90 +++++++++++++++++++ 3 files changed, 120 insertions(+), 14 deletions(-) create mode 100644 src/test/scala/org/apache/spark/sql/delta/DeltaErrorsSuite.scala diff --git a/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala b/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala index c1c6027340a..4360ac5697d 100644 --- a/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala +++ b/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala @@ -38,13 +38,22 @@ import org.apache.spark.sql.types.{DataType, StructField, StructType} trait DocsPath { /** - * The URL for the base path of Delta's docs. + * The URL for the base path of Delta's docs. When changing this path, ensure that the new path + * works with the error messages below. */ - def baseDocsPath(conf: SparkConf): String = "https://docs.delta.io" + protected def baseDocsPath(conf: SparkConf): String = "https://docs.delta.io/latest" + + def generateDocsLink(conf: SparkConf, path: String): String = { + baseDocsPath(conf) + path + } } /** * A holder object for Delta errors. + * + * IMPORTANT: Any time you add a test that references the docs, add to the Seq defined in + * DeltaErrorsSuite so that the doc links that are generated can be verified to work in Azure, + * docs.databricks.com and docs.delta.io */ object DeltaErrors extends DocsPath @@ -52,6 +61,8 @@ object DeltaErrors def baseDocsPath(spark: SparkSession): String = baseDocsPath(spark.sparkContext.getConf) + val faqRelativePath = "/delta-intro.html#frequently-asked-questions" + val DeltaSourceIgnoreDeleteErrorMessage = "Detected deleted data from streaming source. This is currently not supported. If you'd like " + "to ignore deletes, set the option 'ignoreDeletes' to 'true'." @@ -67,12 +78,11 @@ object DeltaErrors * Note that we must pass in the docAddress as a string, because the config is not available on * executors where this method is called. */ - def deltaFileNotFoundHint(path: String, docAddress: String): String = { + def deltaFileNotFoundHint(faqPath: String, path: String): String = { recordDeltaEvent(null, "delta.error.fileNotFound", data = path) - val faq = docAddress + "/delta/delta-intro.html#frequently-asked-questions" "A file referenced in the transaction log cannot be found. This occurs when data has been " + "manually deleted from the file system rather than using the table `DELETE` statement. " + - s"For more information, see $faq" + s"For more information, see $faqPath" } def formatColumn(colName: String): String = s"`$colName`" @@ -211,7 +221,8 @@ object DeltaErrors |using format("delta") and that you are trying to $operation the table base path. | |To disable this check, SET spark.databricks.delta.formatCheck.enabled=false - |To learn more about Delta, see ${baseDocsPath(spark)}/delta/index.html + |To learn more about Delta, see ${generateDocsLink(spark.sparkContext.getConf, + "/index.html")} |""".stripMargin) } @@ -229,7 +240,8 @@ object DeltaErrors |'format("delta")' when reading and writing to a delta table. | |To disable this check, SET spark.databricks.delta.formatCheck.enabled=false - |To learn more about Delta, see ${baseDocsPath(spark)}/delta/index.html + |To learn more about Delta, see + |${generateDocsLink(spark.sparkContext.getConf, "/index.html")} |""".stripMargin) } @@ -490,7 +502,8 @@ object DeltaErrors |`$path/_delta_log`. Check the upstream job to make sure that it is writing using |format("delta") and that the path is the root of the table. | - |To learn more about Delta, see ${baseDocsPath(spark)}/delta/index.html + |To learn more about Delta, see ${generateDocsLink(spark.sparkContext.getConf, + "/index.html")} """.stripMargin) } @@ -502,7 +515,8 @@ object DeltaErrors |from `$path` using Delta Lake, but the schema is not specified when the |input path is empty. | - |To learn more about Delta, see ${baseDocsPath(spark)}/delta/index.html + |To learn more about Delta, see ${generateDocsLink(spark.sparkContext.getConf, + "/index.html")} """.stripMargin) } @@ -513,7 +527,8 @@ object DeltaErrors |You are trying to create a managed table $tableName |using Delta Lake, but the schema is not specified. | - |To learn more about Delta, see ${baseDocsPath(spark)}/delta/index.html + |To learn more about Delta, see ${generateDocsLink(spark.sparkContext.getConf, + "/index.html")} """.stripMargin) } @@ -717,8 +732,9 @@ abstract class DeltaConcurrentModificationException(message: String) def this(baseMessage: String, conflictingCommit: Option[CommitInfo]) = this( baseMessage + conflictingCommit.map(ci => s"\nConflicting commit: ${JsonUtils.toJson(ci)}").getOrElse("") + - s"\nRefer to ${DeltaErrors.baseDocsPath(SparkEnv.get.conf)}" + - "/delta/isolation-level.html#optimistic-concurrency-control for more details." + s"\nRefer to " + + s"${DeltaErrors.generateDocsLink(SparkEnv.get.conf, "/concurrency-control.html")} " + + "for more details." ) /** diff --git a/src/main/scala/org/apache/spark/sql/delta/sources/DeltaSource.scala b/src/main/scala/org/apache/spark/sql/delta/sources/DeltaSource.scala index 5fc9772f8db..95920e2bbf4 100644 --- a/src/main/scala/org/apache/spark/sql/delta/sources/DeltaSource.scala +++ b/src/main/scala/org/apache/spark/sql/delta/sources/DeltaSource.scala @@ -72,8 +72,8 @@ case class DeltaSource( // Deprecated. Please use `ignoreDeletes` or `ignoreChanges` from now on. private val ignoreFileDeletion = { if (options.ignoreFileDeletion) { - val docPage = DeltaErrors.baseDocsPath(spark.sparkContext.getConf) + - "/delta/delta-streaming.html#ignoring-updates-and-deletes" + val docPage = DeltaErrors.generateDocsLink(spark.sparkContext.getConf, + "/delta/delta-streaming.html#ignoring-updates-and-deletes") logConsole( s"""WARNING: The 'ignoreFileDeletion' option is deprecated. Switch to using one of |'ignoreDeletes' or 'ignoreChanges'. Refer to $docPage for details. diff --git a/src/test/scala/org/apache/spark/sql/delta/DeltaErrorsSuite.scala b/src/test/scala/org/apache/spark/sql/delta/DeltaErrorsSuite.scala new file mode 100644 index 00000000000..afb586d4a44 --- /dev/null +++ b/src/test/scala/org/apache/spark/sql/delta/DeltaErrorsSuite.scala @@ -0,0 +1,90 @@ +/* + * Copyright 2019 Databricks, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.spark.sql.delta + +import scala.sys.process.Process + +import org.apache.hadoop.fs.Path +import org.scalatest.GivenWhenThen + +import org.apache.spark.sql.QueryTest +import org.apache.spark.sql.test.{SharedSparkSession, SQLTestUtils} + +trait DeltaErrorsSuiteBase + extends QueryTest + with SharedSparkSession with GivenWhenThen + with SQLTestUtils { + + val MAX_URL_ACCESS_RETRIES = 3 + val path = "/sample/path" + // Map of error name to the actual error message it throws + def errorsToTest: Map[String, Throwable] = Map( + "useDeltaOnOtherFormatPathException" -> + DeltaErrors.useDeltaOnOtherFormatPathException("operation", path, spark), + "useOtherFormatOnDeltaPathException" -> + DeltaErrors.useOtherFormatOnDeltaPathException("operation", path, path, "format", spark), + "createExternalTableWithoutLogException" -> + DeltaErrors.createExternalTableWithoutLogException(new Path(path), "tableName", spark), + "createExternalTableWithoutSchemaException" -> + DeltaErrors.createExternalTableWithoutSchemaException(new Path(path), "tableName", spark), + "createManagedTableWithoutSchemaException" -> + DeltaErrors.createManagedTableWithoutSchemaException("tableName", spark)) + + def otherMessagesToTest: Map[String, String] = Map( + "deltaFileNotFoundHint" -> + DeltaErrors.deltaFileNotFoundHint( + DeltaErrors.generateDocsLink(sparkConf, DeltaErrors.faqRelativePath), path)) + + def errorMessagesToTest: Map[String, String] = + errorsToTest.mapValues(_.getMessage) ++ otherMessagesToTest + + def checkIfValidResponse(url: String, response: String): Boolean = { + response.contains("HTTP/1.1 200 OK") || response.contains("HTTP/2 200") + } + + def getUrlsFromMessage(message: String): List[String] = { + val regexToFindUrl = "https://[^\\s]+".r + regexToFindUrl.findAllIn(message).toList + } + + def testUrls() { + errorMessagesToTest.foreach { case (errName, message) => + getUrlsFromMessage(message).foreach { url => + Given(s"*** Checking response for url: $url") + var response = "" + (1 to MAX_URL_ACCESS_RETRIES).foreach { attempt => + if (attempt > 1) Thread.sleep(1000) + response = Process("curl -I " + url).!! + if (!checkIfValidResponse(url, response)) { + fail( + s""" + |A link to the URL: '$url' is broken in the error: $errName, accessing this URL + |does not result in a valid response, received the following response: $response + """.stripMargin) + } + } + } + } + } + + test("Validate that links to docs in DeltaErrors are correct") { + testUrls() + } +} + +class DeltaErrorsSuite + extends DeltaErrorsSuiteBase From 878ebda7d6e6a3752558bc75c5ebaf5232e66bb9 Mon Sep 17 00:00:00 2001 From: Burak Yavuz Date: Thu, 12 Dec 2019 19:49:57 +0000 Subject: [PATCH 28/44] [SC-26788][DELTA] Fix issue with DateType partition columns in ConvertToDelta ## What changes were proposed in this pull request? DateType and TimestampType partitions were not working in ConvertToDelta, because we were not passing in the timezone information during casting. Before we would get a `None.get` error being thrown from the Cast, trying to see if the directory partition value when cast to the data type returned null. ## How was this patch tested? Regression test Author: Burak Yavuz Author: Burak Yavuz #7288 is resolved by brkyvz/convert. GitOrigin-RevId: 598bd4ee434672cf71e778208a13b24061a055ba --- .../delta/commands/ConvertToDeltaCommand.scala | 17 +++++++++++------ .../sql/delta/ConvertToDeltaSuiteBase.scala | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/main/scala/org/apache/spark/sql/delta/commands/ConvertToDeltaCommand.scala b/src/main/scala/org/apache/spark/sql/delta/commands/ConvertToDeltaCommand.scala index ec1b86aa669..7b7f221147e 100644 --- a/src/main/scala/org/apache/spark/sql/delta/commands/ConvertToDeltaCommand.scala +++ b/src/main/scala/org/apache/spark/sql/delta/commands/ConvertToDeltaCommand.scala @@ -39,6 +39,7 @@ import org.apache.spark.sql.catalyst.catalog.CatalogTable import org.apache.spark.sql.catalyst.expressions.Cast import org.apache.spark.sql.execution.command.RunnableCommand import org.apache.spark.sql.execution.datasources.parquet.{ParquetFileFormat, ParquetToSparkSchemaConverter} +import org.apache.spark.sql.internal.SQLConf import org.apache.spark.sql.types.{StringType, StructField, StructType} import org.apache.spark.util.{SerializableConfiguration, Utils} @@ -173,8 +174,7 @@ abstract class ConvertToDeltaCommandBase( spark.sessionState.conf.getConf(DeltaSQLConf.DELTA_IMPORT_BATCH_SIZE_STATS_COLLECTION) val addFilesIter = fileListResult.asScala.grouped(statsBatchSize).flatMap { batch => - val resolver = spark.sessionState.conf.resolver - val adds = batch.map(createAddFile(_, txn.deltaLog.dataPath, fs, resolver)) + val adds = batch.map(createAddFile(_, txn.deltaLog.dataPath, fs, spark.sessionState.conf)) adds.toIterator } streamWrite( @@ -193,12 +193,16 @@ abstract class ConvertToDeltaCommandBase( } protected def createAddFile( - file: SerializableFileStatus, basePath: Path, fs: FileSystem, resolver: Resolver): AddFile = { + file: SerializableFileStatus, + basePath: Path, + fs: FileSystem, + conf: SQLConf): AddFile = { val path = file.getPath val pathStr = file.getPath.toUri.toString val dateFormatter = DateFormatter() val timestampFormatter = TimestampFormatter(timestampPartitionPattern, java.util.TimeZone.getDefault) + val resolver = conf.resolver val (partitionOpt, _) = PartitionUtils.parsePartition( path, typeInference = false, @@ -215,10 +219,11 @@ abstract class ConvertToDeltaCommandBase( pathStr, partValues.columnNames, partitionColNames) } + val tz = Option(conf.sessionLocalTimeZone) // Check if the partition value can be casted to the provided type partValues.literals.zip(partitionFields).foreach { case (literal, field) => - if (literal.eval() != null && Cast(literal, field.dataType).eval() == null) { - val partitionValue = Cast(literal, StringType).eval() + if (literal.eval() != null && Cast(literal, field.dataType, tz).eval() == null) { + val partitionValue = Cast(literal, StringType, tz).eval() val partitionValueStr = Option(partitionValue).map(_.toString).orNull throw DeltaErrors.castPartitionValueException(partitionValueStr, field.dataType) } @@ -226,7 +231,7 @@ abstract class ConvertToDeltaCommandBase( val values = partValues .literals - .map(l => Cast(l, StringType).eval()) + .map(l => Cast(l, StringType, tz).eval()) .map(Option(_).map(_.toString).orNull) partitionColNames.zip(partValues.columnNames).foreach { case (expected, parsed) => diff --git a/src/test/scala/org/apache/spark/sql/delta/ConvertToDeltaSuiteBase.scala b/src/test/scala/org/apache/spark/sql/delta/ConvertToDeltaSuiteBase.scala index 0dde1da37f6..82b2f623946 100644 --- a/src/test/scala/org/apache/spark/sql/delta/ConvertToDeltaSuiteBase.scala +++ b/src/test/scala/org/apache/spark/sql/delta/ConvertToDeltaSuiteBase.scala @@ -380,6 +380,24 @@ abstract class ConvertToDeltaSuiteBase extends QueryTest } } + test("converting tables with dateType partition columns") { + withTempDir { dir => + val tempDir = dir.getCanonicalPath + val df1 = Seq(0).toDF("id").withColumn("key1", lit("2019-11-22").cast("date")) + + val df2 = Seq(1).toDF("id").withColumn("key1", lit(null)) + + writeFiles(tempDir, df1.union(df2), partCols = Seq("key1")) + convertToDelta(s"parquet.`$tempDir`", Some("key1 date")) + checkAnswer( + spark.read.format("delta").load(tempDir).where("key1 is null").select("id"), + Row(1)) + checkAnswer( + spark.read.format("delta").load(tempDir).where("key1 = '2019-11-22'").select("id"), + Row(0)) + } + } + test("empty string partition value will be read back as null") { withTempDir { dir => val tempDir = dir.getCanonicalPath From 0ddd3322b03964aaccce4ded5eb5d67788331fed Mon Sep 17 00:00:00 2001 From: Rahul Mahadev Date: Thu, 12 Dec 2019 23:28:42 +0000 Subject: [PATCH 29/44] Setting version to 0.5.0 --- version.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.sbt b/version.sbt index 5492cbd58ca..53270e0a1ee 100644 --- a/version.sbt +++ b/version.sbt @@ -1 +1 @@ -version in ThisBuild := "0.4.1-SNAPSHOT" +version in ThisBuild := "0.5.0" \ No newline at end of file From 2168cebad3491fd2c6fa9006d568815d6ec03063 Mon Sep 17 00:00:00 2001 From: Rahul Mahadev Date: Thu, 12 Dec 2019 23:30:15 +0000 Subject: [PATCH 30/44] Setting version to 0.5.1-SNAPSHOT --- version.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.sbt b/version.sbt index 53270e0a1ee..613ddbdb997 100644 --- a/version.sbt +++ b/version.sbt @@ -1 +1 @@ -version in ThisBuild := "0.5.0" \ No newline at end of file +version in ThisBuild := "0.5.1-SNAPSHOT" \ No newline at end of file From 1d1ffb99209fc35f8d542196e0092bcd24151dad Mon Sep 17 00:00:00 2001 From: Rahul Mahadev Date: Fri, 13 Dec 2019 02:45:41 +0000 Subject: [PATCH 31/44] [DELTA] Bumping version to match delta OSS version bumping version number to match with delta OSS release Tests will start passing after maven release Author: Rahul Mahadev GitOrigin-RevId: 5906a613a4ceb960dd8670f4299b6c7de4c30341 --- version.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.sbt b/version.sbt index 613ddbdb997..7338ce76529 100644 --- a/version.sbt +++ b/version.sbt @@ -1 +1 @@ -version in ThisBuild := "0.5.1-SNAPSHOT" \ No newline at end of file +version in ThisBuild := "0.5.1-SNAPSHOT" From b092e8db4bfe460be070bc4a04d4d83c721a6d5f Mon Sep 17 00:00:00 2001 From: Rahul Shivu Mahadev <51690557+rahulsmahadev@users.noreply.github.com> Date: Fri, 13 Dec 2019 03:08:30 +0000 Subject: [PATCH 32/44] [DELTA-OSS-EXTERNAL] Updates Scala/Python examples with 0.5.0 features Updating examples to include examples 1. Streaming: Streaming append and concurrent repartition using `dataChange=false` 2. Utilities: generating manifest files. built jar and tested locally. Closes delta-io/delta#267 Author: Rahul Shivu Mahadev <51690557+rahulsmahadev@users.noreply.github.com> Author: Rahul Mahadev #7278 is resolved by rahulsmahadev/ujcblitf. GitOrigin-RevId: 14de114a98d8a4075e27525c0889e438fdcc90e5 --- examples/python/streaming.py | 33 ++++++++++++++++++- examples/python/utilities.py | 4 +++ examples/scala/build.sbt | 2 +- .../src/main/scala/example/Streaming.scala | 30 +++++++++++++++-- .../src/main/scala/example/Utilities.scala | 4 +++ 5 files changed, 69 insertions(+), 4 deletions(-) diff --git a/examples/python/streaming.py b/examples/python/streaming.py index 52347758603..da8c1905c29 100644 --- a/examples/python/streaming.py +++ b/examples/python/streaming.py @@ -24,7 +24,8 @@ import threading # Clear previous run delta-tables -files = ["/tmp/delta-table", "/tmp/delta-table2", "/tmp/delta-table3"] +files = ["/tmp/delta-table", "/tmp/delta-table2", "/tmp/delta-table3", "/tmp/delta-table4", + "/tmp/delta-table5", "/tmp/checkpoint/tbl1"] for i in files: try: shutil.rmtree(i) @@ -94,6 +95,36 @@ def upsertToDelta(microBatchOutputDF, batchId): print("########### DeltaTable after streaming upsert #########") deltaTable.toDF().show() +# Streaming append and concurrent repartition using data change = false +# tbl1 is the sink and tbl2 is the source +print("############ Streaming appends with concurrent table repartition ##########") +tbl1 = "/tmp/delta-table4" +tbl2 = "/tmp/delta-table5" +numRows = 10 +spark.range(numRows).write.mode("overwrite").format("delta").save(tbl1) +spark.read.format("delta").load(tbl1).show() +spark.range(numRows, numRows * 10).write.mode("overwrite").format("delta").save(tbl2) + + +# Start reading tbl2 as a stream and do a streaming write to tbl1 +# Prior to Delta 0.5.0 this would throw StreamingQueryException: Detected a data update in the +# source table. This is currently not supported. +stream4 = spark.readStream.format("delta").load(tbl2).writeStream.format("delta")\ + .option("checkpointLocation", "/tmp/checkpoint/tbl1") \ + .outputMode("append") \ + .start(tbl1) + +# repartition table while streaming job is running +spark.read.format("delta").load(tbl2).repartition(10).write\ + .format("delta")\ + .mode("overwrite")\ + .option("dataChange", "false")\ + .save(tbl2) + +stream4.awaitTermination(10) +stream4.stop() +print("######### After streaming write #########") +spark.read.format("delta").load(tbl1).show() # cleanup for i in files: try: diff --git a/examples/python/utilities.py b/examples/python/utilities.py index 4f4876806bb..13d00429bbb 100644 --- a/examples/python/utilities.py +++ b/examples/python/utilities.py @@ -71,6 +71,10 @@ print("######## Describe history for the table ######") deltaTable.history().show() +# Generate manifest +print("######## Generating manifest ######") +deltaTable.generate("SYMLINK_FORMAT_MANIFEST") + # SQL Vacuum print("####### SQL Vacuum #######") spark.sql("VACUUM '%s' RETAIN 169 HOURS" % "/tmp/delta-table").collect() diff --git a/examples/scala/build.sbt b/examples/scala/build.sbt index 691ebaea08c..ea12d8f27f9 100644 --- a/examples/scala/build.sbt +++ b/examples/scala/build.sbt @@ -23,6 +23,6 @@ version := "0.1.0" lazy val root = (project in file(".")) .settings( name := "hello-world", - libraryDependencies += "io.delta" %% "delta-core" % "0.4.0", + libraryDependencies += "io.delta" %% "delta-core" % "0.5.0", libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.4.3", resolvers += "Delta" at "https://dl.bintray.com/delta-io/delta/") diff --git a/examples/scala/src/main/scala/example/Streaming.scala b/examples/scala/src/main/scala/example/Streaming.scala index d90756f2fad..e8c621dd806 100644 --- a/examples/scala/src/main/scala/example/Streaming.scala +++ b/examples/scala/src/main/scala/example/Streaming.scala @@ -107,9 +107,35 @@ object Streaming { println("Delta Table after streaming upsert") deltaTable.toDF.show() + // Streaming append and concurrent repartition using data change = false + // tbl1 is the sink and tbl2 is the source + println("############ Streaming appends with concurrent table repartition ##########") + val tbl1 = "/tmp/delta-table4" + val tbl2 = "/tmp/delta-table5" + val numRows = 10 + spark.range(numRows).write.mode("overwrite").format("delta").save(tbl1) + spark.read.format("delta").load(tbl1).show() + spark.range(numRows, numRows * 10).write.mode("overwrite").format("delta").save(tbl2) + + // Start reading tbl2 as a stream and do a streaming write to tbl1 + // Prior to Delta 0.5.0 this would throw StreamingQueryException: Detected a data update in the source table. This is currently not supported. + val stream4 = spark.readStream.format("delta").load(tbl2).writeStream.format("delta") + .option("checkpointLocation", new File("/tmp/checkpoint/tbl1").getCanonicalPath) + .outputMode("append") + .start(tbl1) + + // repartition table while streaming job is running + spark.read.format("delta").load(tbl2).repartition(10).write.format("delta").mode("overwrite").option("dataChange", "false").save(tbl2) + + stream4.awaitTermination(10) + stream4.stop() + println("######### After streaming write #########") + spark.read.format("delta").load(tbl1).show() + // Cleanup - FileUtils.deleteDirectory(new File(path)) - FileUtils.deleteDirectory(new File(tablePath2)) + Seq(path, tbl1, tbl2, "/tmp/checkpoint/tbl1", tablePath2).foreach { path => + FileUtils.deleteDirectory(new File(path)) + } spark.stop() } } diff --git a/examples/scala/src/main/scala/example/Utilities.scala b/examples/scala/src/main/scala/example/Utilities.scala index 2dbe8ca7a4b..5209ca4d424 100644 --- a/examples/scala/src/main/scala/example/Utilities.scala +++ b/examples/scala/src/main/scala/example/Utilities.scala @@ -65,6 +65,10 @@ object Utilities { println("Describe History for the table") deltaTable.history().show() + // Generate manifest + println("Generate Manifest files") + deltaTable.generate("SYMLINK_FORMAT_MANIFEST") + // SQL utility commands println("SQL Vacuum") spark.sql(s"VACUUM '$path' RETAIN 169 HOURS") From eb1389b976cb5224abe83e34d7978bea76edfe2a Mon Sep 17 00:00:00 2001 From: Tathagata Das Date: Fri, 13 Dec 2019 04:57:34 +0000 Subject: [PATCH 33/44] [DELTA-OSS-EXTERNAL] Update latest Delta version in readme to 0.5.0 Closes delta-io/delta#272 Author: Tathagata Das #7299 is resolved by tdas/obke9grz. GitOrigin-RevId: d5ee228f5e52af134a925c76378028da572c20e3 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 757396f342e..51c33b28b83 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ You include Delta Lake in your Maven project by adding it as a dependency in you io.delta delta-core_2.11 - 0.4.0 + 0.5.0 ``` @@ -27,7 +27,7 @@ You include Delta Lake in your Maven project by adding it as a dependency in you You include Delta Lake in your SBT project by adding the following line to your build.sbt file: ```scala -libraryDependencies += "io.delta" %% "delta-core" % "0.4.0" +libraryDependencies += "io.delta" %% "delta-core" % "0.5.0" ``` ## API Documentation From e6fbc27f81484565593d3458500dff018e91850f Mon Sep 17 00:00:00 2001 From: Timothy Zhang Date: Sat, 14 Dec 2019 20:08:48 +0000 Subject: [PATCH 34/44] [DELTA-OSS-EXTERNAL] Updated example Streaming 1. Added some println as comments for different sections 2. Added variable checkpointPath to replace hardcode in option 3. Changed duration of stream3 from 10000 to 20000 so as to get obvious results for updated Delta Table 4. Added a delete statement of checkpoint directory in the end Closes delta-io/delta#270 Author: Timothy Zhang Author: Rahul Mahadev GitOrigin-RevId: 66b8da80dce9f5fac3922638ea064f4272842969 --- .../scala/src/main/scala/example/Streaming.scala | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/examples/scala/src/main/scala/example/Streaming.scala b/examples/scala/src/main/scala/example/Streaming.scala index e8c621dd806..194c6cf559b 100644 --- a/examples/scala/src/main/scala/example/Streaming.scala +++ b/examples/scala/src/main/scala/example/Streaming.scala @@ -36,6 +36,7 @@ object Streaming { import spark.implicits._ + println("=== Section 1: write and read delta table using batch queries, and initialize table for later sections") // Create a table val data = spark.range(0, 5) val path = new File("/tmp/delta-table").getAbsolutePath @@ -45,20 +46,21 @@ object Streaming { val df = spark.read.format("delta").load(path) df.show() - println("Streaming write") + + println("=== Section 2: write and read delta using structured streaming") val streamingDf = spark.readStream.format("rate").load() val tablePath2 = new File("/tmp/delta-table2").getCanonicalPath + val checkpointPath = new File("/tmp/checkpoint").getCanonicalPath val stream = streamingDf .select($"value" as "id") .writeStream .format("delta") - .option("checkpointLocation", new File("/tmp/checkpoint").getCanonicalPath) + .option("checkpointLocation", checkpointPath) .start(tablePath2) stream.awaitTermination(10000) stream.stop() - println("Reading from stream") val stream2 = spark .readStream .format("delta") @@ -70,8 +72,9 @@ object Streaming { stream2.awaitTermination(10000) stream2.stop() + + println("=== Section 3: Streaming upserts using MERGE") // Function to upsert microBatchOutputDF into Delta Lake table using merge - println("Streaming upgrades in update mode") def upsertToDelta(microBatchOutputDF: DataFrame, batchId: Long) { val deltaTable = DeltaTable.forPath(path) deltaTable.as("t") @@ -101,7 +104,7 @@ object Streaming { .outputMode("update") .start() - stream3.awaitTermination(10000) + stream3.awaitTermination(20000) stream3.stop() println("Delta Table after streaming upsert") @@ -132,6 +135,7 @@ object Streaming { println("######### After streaming write #########") spark.read.format("delta").load(tbl1).show() + println("=== In the end, clean all paths") // Cleanup Seq(path, tbl1, tbl2, "/tmp/checkpoint/tbl1", tablePath2).foreach { path => FileUtils.deleteDirectory(new File(path)) From e7db8325705d08074bf01bdfc1a6d2768f0c8929 Mon Sep 17 00:00:00 2001 From: Burak Yavuz Date: Tue, 17 Dec 2019 00:35:42 +0000 Subject: [PATCH 35/44] [SC-26785][DELTA] Prepare for Alter Table support Add an error message that will be needed to support ALTER TABLE. Unit tests Author: Burak Yavuz Author: Burak Yavuz GitOrigin-RevId: d452857d712988d9b28ff16e1f8ff656ac91334c --- src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala b/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala index 4360ac5697d..af7c86cf937 100644 --- a/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala +++ b/src/main/scala/org/apache/spark/sql/delta/DeltaErrors.scala @@ -700,6 +700,10 @@ object DeltaErrors |%sql set spark.databricks.delta.alterLocation.bypassSchemaCheck = true""".stripMargin) } + def setLocationNotSupportedOnPathIdentifiers(): Throwable = { + throw new AnalysisException("Cannot change the location of a path based table.") + } + def describeViewHistory: Throwable = { new AnalysisException("Cannot describe the history of a view.") } From 0b4138539b7041ae19bd6a9606cfef054334a808 Mon Sep 17 00:00:00 2001 From: Xiao Li Date: Mon, 16 Dec 2019 17:52:20 -0800 Subject: [PATCH 36/44] Fixup some import statements GitOrigin-RevId: c11bd517e4f23820886d972e21a6eb74d96a9287 --- .../apache/spark/sql/delta/commands/MergeIntoCommand.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/scala/org/apache/spark/sql/delta/commands/MergeIntoCommand.scala b/src/main/scala/org/apache/spark/sql/delta/commands/MergeIntoCommand.scala index 5cbf603c801..c066ed89f01 100644 --- a/src/main/scala/org/apache/spark/sql/delta/commands/MergeIntoCommand.scala +++ b/src/main/scala/org/apache/spark/sql/delta/commands/MergeIntoCommand.scala @@ -28,8 +28,8 @@ import org.apache.spark.SparkContext import org.apache.spark.sql._ import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.encoders.{ExpressionEncoder, RowEncoder} -import org.apache.spark.sql.catalyst.expressions._ -import org.apache.spark.sql.catalyst.expressions.codegen.{GeneratePredicate, Predicate} +import org.apache.spark.sql.catalyst.expressions.{Alias, Attribute, AttributeReference, Expression, Literal, PredicateHelper, UnsafeProjection} +import org.apache.spark.sql.catalyst.expressions.codegen._ import org.apache.spark.sql.catalyst.plans.logical._ import org.apache.spark.sql.execution.SQLExecution import org.apache.spark.sql.execution.command.RunnableCommand From 67e89b051354bc787dc3f1f5f583717abc0a9673 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Or=C5=82owski?= Date: Tue, 17 Dec 2019 09:13:55 +0000 Subject: [PATCH 37/44] [DELTA-OSS-EXTERNAL] Update Delta README Slack register link MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The old invite link is no longer active. The new one was posted by @dennyglee via Delta Lake Users and Developers mailing list, here: https://groups.google.com/forum/#!topic/delta-users/tv_umPl2avs Closes delta-io/delta#273 Author: Jakub Orłowski Author: Rahul Mahadev #7323 is resolved by rahulsmahadev/4u0z8neq. GitOrigin-RevId: 1f7938f08f44a6a6330abf70c96ee5de74a48a39 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 51c33b28b83..317bd71c4ad 100644 --- a/README.md +++ b/README.md @@ -109,7 +109,7 @@ We welcome contributions to Delta Lake. We use [GitHub Pull Requests ](https://g There are two mediums of communication within the Delta Lake community. - Public Slack Channel - - [Register here](https://join.slack.com/t/delta-users/shared_invite/enQtNTY1NDg0ODcxOTI1LWJkZGU3ZmQ3MjkzNmY2ZDM0NjNlYjE4MWIzYjg2OWM1OTBmMWIxZTllMjg3ZmJkNjIwZmE1ZTZkMmQ0OTk5ZjA) + - [Register here](https://join.slack.com/t/delta-users/shared_invite/enQtODQ5ODM5OTAxMjAwLWY4NGI5ZmQ3Y2JmMjZjYjc1MDkwNTA5YTQ4MzhjOWY1MmVjNTM2OGZhNTExNmM5MzQ0YzEzZjIwMjc0OGI0OGM) - [Login here](https://delta-users.slack.com/) - Public [Mailing list](https://groups.google.com/forum/#!forum/delta-users) From d38fdc0e944a8836a7a63ed1891a02473dacca0f Mon Sep 17 00:00:00 2001 From: Jose Torres Date: Tue, 17 Dec 2019 15:46:06 -0800 Subject: [PATCH 38/44] [SC-24886][DELTA] Evaluate partition predicates on the right data type ## What changes were proposed in this pull request? Right now, we use the wrong data type for partition columns when evaluating partition predicates for the Delta file index - they are always strings. This almost always works because of implicit casting, but there are a few edge cases where implicit casts are not added and we must explicitly set the right type. SC-10573 was an earlier patch for one such case; we made it minimal to safely warmfix it, but kinda dropped the ball on doing the non-minimal fix. ## How was this patch tested? new unit test, along with the old one for the old patch Closes #6743 from jose-torres/fixparttype. Authored-by: Jose Torres Signed-off-by: Jose Torres GitOrigin-RevId: fc63605f97da3f937cf8f33cda7f7d504a024d36 --- .../org/apache/spark/sql/delta/DeltaLog.scala | 33 ++++++++++--------- .../sql/delta/OptimisticTransaction.scala | 2 +- .../spark/sql/delta/PartitionFiltering.scala | 2 +- .../sql/delta/commands/WriteIntoDelta.scala | 2 +- .../sql/delta/files/DeltaSourceSnapshot.scala | 2 +- .../sql/delta/files/TahoeFileIndex.scala | 2 +- .../sql/delta/sources/DeltaDataSource.scala | 2 +- .../apache/spark/sql/delta/DeltaSuite.scala | 17 ++++++++++ 8 files changed, 41 insertions(+), 21 deletions(-) diff --git a/src/main/scala/org/apache/spark/sql/delta/DeltaLog.scala b/src/main/scala/org/apache/spark/sql/delta/DeltaLog.scala index 0357a60abef..b05852ab256 100644 --- a/src/main/scala/org/apache/spark/sql/delta/DeltaLog.scala +++ b/src/main/scala/org/apache/spark/sql/delta/DeltaLog.scala @@ -39,12 +39,13 @@ import org.apache.hadoop.fs.Path import org.apache.spark.SparkContext import org.apache.spark.sql._ import org.apache.spark.sql.catalyst.analysis.{Resolver, UnresolvedAttribute} -import org.apache.spark.sql.catalyst.expressions.{And, Attribute, Expression, In, InSet, Literal} +import org.apache.spark.sql.catalyst.expressions.{And, Attribute, Cast, Expression, In, InSet, Literal} import org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper import org.apache.spark.sql.execution.datasources._ import org.apache.spark.sql.execution.datasources.json.JsonFileFormat import org.apache.spark.sql.execution.datasources.parquet.ParquetFileFormat import org.apache.spark.sql.sources.{BaseRelation, InsertableRelation} +import org.apache.spark.sql.types.{StructField, StructType} import org.apache.spark.util.{Clock, SystemClock, ThreadUtils} /** @@ -784,12 +785,12 @@ object DeltaLog extends DeltaLogging { * @param partitionColumnPrefixes The path to the `partitionValues` column, if it's nested */ def filterFileList( - partitionColumns: Seq[String], + partitionSchema: StructType, files: DataFrame, partitionFilters: Seq[Expression], partitionColumnPrefixes: Seq[String] = Nil): DataFrame = { val rewrittenFilters = rewritePartitionFilters( - partitionColumns, + partitionSchema, files.sparkSession.sessionState.conf.resolver, partitionFilters, partitionColumnPrefixes) @@ -807,22 +808,24 @@ object DeltaLog extends DeltaLogging { * @param partitionColumnPrefixes The path to the `partitionValues` column, if it's nested */ def rewritePartitionFilters( - partitionColumns: Seq[String], + partitionSchema: StructType, resolver: Resolver, partitionFilters: Seq[Expression], partitionColumnPrefixes: Seq[String] = Nil): Seq[Expression] = { - partitionFilters.map(_.transform { + partitionFilters.map(_.transformUp { case a: Attribute => - val colName = partitionColumns.find(resolver(_, a.name)).getOrElse(a.name) - UnresolvedAttribute(partitionColumnPrefixes ++ Seq("partitionValues", colName)) - }.transform { - // TODO(SC-10573): This is a temporary fix. - // What we really need to do is ensure that the partition filters are evaluated against - // the actual partition values. Right now they're evaluated against a String-casted version - // of the partition value in AddFile. - // As a warmfixable change, we're just transforming the only operator we've seen cause - // problems. - case InSet(a, set) => In(a, set.toSeq.map(Literal(_))) + val partitionCol = partitionSchema.find { field => resolver(field.name, a.name) } + partitionCol match { + case Some(StructField(name, dataType, _, _)) => + Cast( + UnresolvedAttribute(partitionColumnPrefixes ++ Seq("partitionValues", name)), + dataType) + case None => + // This should not be able to happen, but the case was present in the original code so + // we kept it to be safe. + log.error(s"Partition filter referenced column ${a.name} not in the partition schema") + UnresolvedAttribute(partitionColumnPrefixes ++ Seq("partitionValues", a.name)) + } }) } diff --git a/src/main/scala/org/apache/spark/sql/delta/OptimisticTransaction.scala b/src/main/scala/org/apache/spark/sql/delta/OptimisticTransaction.scala index b81e5d80105..aefa8d64d2f 100644 --- a/src/main/scala/org/apache/spark/sql/delta/OptimisticTransaction.scala +++ b/src/main/scala/org/apache/spark/sql/delta/OptimisticTransaction.scala @@ -500,7 +500,7 @@ trait OptimisticTransactionImpl extends TransactionalWrite { } val predicatesMatchingAddedFiles = ExpressionSet(readPredicates).iterator.flatMap { p => val conflictingFile = DeltaLog.filterFileList( - metadata.partitionColumns, + metadata.partitionSchema, addedFilesToCheckForConflicts.toDF(), p :: Nil).as[AddFile].take(1) conflictingFile.headOption.map(f => getPrettyPartitionMessage(f.partitionValues)) diff --git a/src/main/scala/org/apache/spark/sql/delta/PartitionFiltering.scala b/src/main/scala/org/apache/spark/sql/delta/PartitionFiltering.scala index f75a89d1aa4..7ee21f0d803 100644 --- a/src/main/scala/org/apache/spark/sql/delta/PartitionFiltering.scala +++ b/src/main/scala/org/apache/spark/sql/delta/PartitionFiltering.scala @@ -35,7 +35,7 @@ trait PartitionFiltering { } val files = DeltaLog.filterFileList( - metadata.partitionColumns, + metadata.partitionSchema, allFiles.toDF(), partitionFilters).as[AddFile].collect() diff --git a/src/main/scala/org/apache/spark/sql/delta/commands/WriteIntoDelta.scala b/src/main/scala/org/apache/spark/sql/delta/commands/WriteIntoDelta.scala index 6fac31ff08a..aef3821526f 100644 --- a/src/main/scala/org/apache/spark/sql/delta/commands/WriteIntoDelta.scala +++ b/src/main/scala/org/apache/spark/sql/delta/commands/WriteIntoDelta.scala @@ -109,7 +109,7 @@ case class WriteIntoDelta( case (SaveMode.Overwrite, Some(predicates)) => // Check to make sure the files we wrote out were actually valid. val matchingFiles = DeltaLog.filterFileList( - txn.metadata.partitionColumns, newFiles.toDF(), predicates).as[AddFile].collect() + txn.metadata.partitionSchema, newFiles.toDF(), predicates).as[AddFile].collect() val invalidFiles = newFiles.toSet -- matchingFiles if (invalidFiles.nonEmpty) { val badPartitions = invalidFiles diff --git a/src/main/scala/org/apache/spark/sql/delta/files/DeltaSourceSnapshot.scala b/src/main/scala/org/apache/spark/sql/delta/files/DeltaSourceSnapshot.scala index 3881429f997..13e53cf4e46 100644 --- a/src/main/scala/org/apache/spark/sql/delta/files/DeltaSourceSnapshot.scala +++ b/src/main/scala/org/apache/spark/sql/delta/files/DeltaSourceSnapshot.scala @@ -80,7 +80,7 @@ trait SnapshotIterator { import spark.implicits._ if (result == null) { result = DeltaLog.filterFileList( - snapshot.metadata.partitionColumns, + snapshot.metadata.partitionSchema, initialFiles.toDF(), partitionFilters, Seq("add")).as[IndexedFile].collect().toIterable diff --git a/src/main/scala/org/apache/spark/sql/delta/files/TahoeFileIndex.scala b/src/main/scala/org/apache/spark/sql/delta/files/TahoeFileIndex.scala index 00b8b29143e..3f2ef37132c 100644 --- a/src/main/scala/org/apache/spark/sql/delta/files/TahoeFileIndex.scala +++ b/src/main/scala/org/apache/spark/sql/delta/files/TahoeFileIndex.scala @@ -177,7 +177,7 @@ class TahoeBatchFileIndex( dataFilters: Seq[Expression], keepStats: Boolean = false): Seq[AddFile] = { DeltaLog.filterFileList( - snapshot.metadata.partitionColumns, + snapshot.metadata.partitionSchema, spark.createDataset(addFiles)(addFileEncoder).toDF(), partitionFilters) .as[AddFile](addFileEncoder) .collect() diff --git a/src/main/scala/org/apache/spark/sql/delta/sources/DeltaDataSource.scala b/src/main/scala/org/apache/spark/sql/delta/sources/DeltaDataSource.scala index 1f370854c31..f48649bb638 100644 --- a/src/main/scala/org/apache/spark/sql/delta/sources/DeltaDataSource.scala +++ b/src/main/scala/org/apache/spark/sql/delta/sources/DeltaDataSource.scala @@ -198,7 +198,7 @@ class DeltaDataSource EqualTo(UnresolvedAttribute(key), Literal(value)) } val files = DeltaLog.filterFileList( - metadata.partitionColumns, snapshot.allFiles.toDF(), filters) + metadata.partitionSchema, snapshot.allFiles.toDF(), filters) if (files.count() == 0) { throw DeltaErrors.pathNotExistsException(path) } diff --git a/src/test/scala/org/apache/spark/sql/delta/DeltaSuite.scala b/src/test/scala/org/apache/spark/sql/delta/DeltaSuite.scala index 8b07f241b31..83c9911dcd4 100644 --- a/src/test/scala/org/apache/spark/sql/delta/DeltaSuite.scala +++ b/src/test/scala/org/apache/spark/sql/delta/DeltaSuite.scala @@ -883,6 +883,23 @@ class DeltaSuite extends QueryTest } } + test("SC-24886: partition columns have correct datatype in metadata scans") { + withTempDir { inputDir => + Seq(("foo", 2019)).toDF("name", "y") + .write.format("delta").partitionBy("y").mode("overwrite") + .save(inputDir.getAbsolutePath) + + // Before the fix, this query would fail because it tried to read strings from the metadata + // partition values as the LONG type that the actual partition columns are. This works now + // because we added a cast. + val df = spark.read.format("delta") + .load(inputDir.getAbsolutePath) + .where( + """cast(format_string("%04d-01-01 12:00:00", y) as timestamp) is not null""".stripMargin) + assert(df.collect().length == 1) + } + } + test("SC-11332: session isolation for cached delta logs") { withTempDir { tempDir => val path = tempDir.getCanonicalPath From e63f98e48a974e30d5feac90eb534e569b269cc6 Mon Sep 17 00:00:00 2001 From: Burak Yavuz Date: Wed, 18 Dec 2019 02:56:51 +0000 Subject: [PATCH 39/44] [SC-26887][DELTA] Fix the unapply DeltaFullTable DeltaFullTable currently misses filters performed on the relation. This PR fixes the unapply method Author: Burak Yavuz GitOrigin-RevId: 32781a1b2e0b49857a06b37e226b38c02714765b --- .../scala/org/apache/spark/sql/delta/DeltaLog.scala | 5 ++++- .../scala/org/apache/spark/sql/delta/DeltaTable.scala | 11 ++++++----- .../spark/sql/delta/sources/DeltaDataSource.scala | 3 ++- .../apache/spark/sql/delta/MergeIntoSuiteBase.scala | 4 ++-- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/main/scala/org/apache/spark/sql/delta/DeltaLog.scala b/src/main/scala/org/apache/spark/sql/delta/DeltaLog.scala index b05852ab256..196fb53d2e3 100644 --- a/src/main/scala/org/apache/spark/sql/delta/DeltaLog.scala +++ b/src/main/scala/org/apache/spark/sql/delta/DeltaLog.scala @@ -814,7 +814,10 @@ object DeltaLog extends DeltaLogging { partitionColumnPrefixes: Seq[String] = Nil): Seq[Expression] = { partitionFilters.map(_.transformUp { case a: Attribute => - val partitionCol = partitionSchema.find { field => resolver(field.name, a.name) } + // If we have a special column name, e.g. `a.a`, then an UnresolvedAttribute returns + // the column name as '`a.a`' instead of 'a.a', therefore we need to strip the backticks. + val unquoted = a.name.stripPrefix("`").stripSuffix("`") + val partitionCol = partitionSchema.find { field => resolver(field.name, unquoted) } partitionCol match { case Some(StructField(name, dataType, _, _)) => Cast( diff --git a/src/main/scala/org/apache/spark/sql/delta/DeltaTable.scala b/src/main/scala/org/apache/spark/sql/delta/DeltaTable.scala index 5303a00a110..a1b02d390b8 100644 --- a/src/main/scala/org/apache/spark/sql/delta/DeltaTable.scala +++ b/src/main/scala/org/apache/spark/sql/delta/DeltaTable.scala @@ -31,6 +31,7 @@ import org.apache.spark.sql.catalyst.TableIdentifier import org.apache.spark.sql.catalyst.analysis.NoSuchTableException import org.apache.spark.sql.catalyst.catalog.{CatalogTable, SessionCatalog} import org.apache.spark.sql.catalyst.expressions.{Expression, PredicateHelper, SubqueryExpression} +import org.apache.spark.sql.catalyst.planning.PhysicalOperation import org.apache.spark.sql.catalyst.plans.logical.LogicalPlan import org.apache.spark.sql.execution.datasources.{FileIndex, HadoopFsRelation, LogicalRelation} import org.apache.spark.sql.internal.SQLConf @@ -52,17 +53,17 @@ object DeltaTable { * Extractor Object for pulling out the full table scan of a Delta table. */ object DeltaFullTable { - def unapply(a: LogicalRelation): Option[TahoeLogFileIndex] = a match { - case LogicalRelation(HadoopFsRelation(index: TahoeLogFileIndex, _, _, _, _, _), _, _, _) => - if (index.partitionFilters.isEmpty && index.versionToUse.isEmpty) { + def unapply(a: LogicalPlan): Option[TahoeLogFileIndex] = a match { + case PhysicalOperation(_, filters, DeltaTable(index: TahoeLogFileIndex)) => + if (index.partitionFilters.isEmpty && index.versionToUse.isEmpty && filters.isEmpty) { Some(index) } else if (index.versionToUse.nonEmpty) { throw new AnalysisException( s"Expect a full scan of the latest version of the Delta source, but found a historical " + - s"scan of version ${index.versionToUse.get}") + s"scan of version ${index.versionToUse.get}") } else { throw new AnalysisException( - s"Expect a full scan of Delta sources, but found the partial scan. path:${index.path}") + s"Expect a full scan of Delta sources, but found a partial scan. path:${index.path}") } case _ => None diff --git a/src/main/scala/org/apache/spark/sql/delta/sources/DeltaDataSource.scala b/src/main/scala/org/apache/spark/sql/delta/sources/DeltaDataSource.scala index f48649bb638..a8754497a52 100644 --- a/src/main/scala/org/apache/spark/sql/delta/sources/DeltaDataSource.scala +++ b/src/main/scala/org/apache/spark/sql/delta/sources/DeltaDataSource.scala @@ -195,7 +195,8 @@ class DeltaDataSource } val filters = partitions.map { case (key, value) => - EqualTo(UnresolvedAttribute(key), Literal(value)) + // Nested fields cannot be partitions, so we pass the key as a identifier + EqualTo(UnresolvedAttribute(Seq(key)), Literal(value)) } val files = DeltaLog.filterFileList( metadata.partitionSchema, snapshot.allFiles.toDF(), filters) diff --git a/src/test/scala/org/apache/spark/sql/delta/MergeIntoSuiteBase.scala b/src/test/scala/org/apache/spark/sql/delta/MergeIntoSuiteBase.scala index b765b503287..5a9a5c1b9fb 100644 --- a/src/test/scala/org/apache/spark/sql/delta/MergeIntoSuiteBase.scala +++ b/src/test/scala/org/apache/spark/sql/delta/MergeIntoSuiteBase.scala @@ -696,7 +696,7 @@ abstract class MergeIntoSuiteBase update = "key2 = 20 + key1, value = 20 + src.value", insert = "(key2, value) VALUES (key1 - 10, src.value + 10)") }.getMessage - errorContains(e, "MERGE destination only supports Delta sources") + errorContains(e, "Expect a full scan of Delta sources, but found a partial scan") } } @@ -713,7 +713,7 @@ abstract class MergeIntoSuiteBase update = "key2 = 20 + key1, value = 20 + src.value", insert = "(key2, value) VALUES (key1 - 10, src.value + 10)") }.getMessage - errorContains(e, "Expect a full scan of Delta sources, but found the partial scan") + errorContains(e, "Expect a full scan of Delta sources, but found a partial scan") } Seq(true, false).foreach { isPartitioned => From 44f255f417aa95031c8ceba8f72dd215dce297bb Mon Sep 17 00:00:00 2001 From: hongdd Date: Wed, 18 Dec 2019 21:34:19 +0000 Subject: [PATCH 40/44] [DELTA-OSS-EXTERNAL] Update README.md version to 0.5.0 update 0.4.0 to latest version Closes delta-io/delta#279 Author: hongdd #7375 is resolved by mukulmurthy/z0yaa3go. GitOrigin-RevId: 50f69cb9b8cc3bd4119eaba93172921403a31dfc --- examples/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/README.md b/examples/README.md index 4c002977eda..c0f066008f9 100644 --- a/examples/README.md +++ b/examples/README.md @@ -6,5 +6,5 @@ In this folder there are examples taken from the delta.io quickstart guide and d * PySpark is required for running python examples ### Instructions -* To run an example in Python run `spark-submit --packages io.delta:delta-core_2.11:0.4.0 PATH/TO/EXAMPLE` +* To run an example in Python run `spark-submit --packages io.delta:delta-core_2.11:0.5.0 PATH/TO/EXAMPLE` * To run the Scala examples, `cd examples/scala` and run `./build/sbt "runMain example.{Example class name}"` e.g. `./build/sbt "runMain example.Quickstart"` \ No newline at end of file From 8f8df61b383e94a3d4a170c16c3d2384f98e5653 Mon Sep 17 00:00:00 2001 From: Steve Suh Date: Wed, 18 Dec 2019 23:34:05 +0000 Subject: [PATCH 41/44] [DELTA-OSS-EXTERNAL] Fix typo in DeltaTable Generate method descriptions The Generate method descriptions list **symlink_manifest_format** as a valid mode, however the [Generate documentation](https://docs.delta.io/latest/delta-utility.html#generate) as well as the [DeltaGenerateCommand](https://github.com/delta-io/delta/blob/2a322facb5c57e7322302ab878eddb16ff21b5f1/src/main/scala/org/apache/spark/sql/delta/commands/DeltaGenerateCommand.scala#L66) use **symlink_format_manifest** Closes delta-io/delta#284 Author: Steve Suh #7378 is resolved by rahulsmahadev/s3qo81ns. GitOrigin-RevId: 83c7e4f6e39a35a2b6c05b6d848158b9c24a09e4 --- python/delta/tables.py | 2 +- src/main/scala/io/delta/tables/DeltaTable.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/python/delta/tables.py b/python/delta/tables.py index 4ac67aea09d..75400f554a8 100644 --- a/python/delta/tables.py +++ b/python/delta/tables.py @@ -67,7 +67,7 @@ def generate(self, mode): :param mode: mode for the type of manifest file to be generated The valid modes are as follows (not case sensitive): - - "symlink_manifest_format" : This will generate manifests in symlink format + - "symlink_format_manifest" : This will generate manifests in symlink format for Presto and Athena read support. See the online documentation for more information. diff --git a/src/main/scala/io/delta/tables/DeltaTable.scala b/src/main/scala/io/delta/tables/DeltaTable.scala index c590237e088..01db5d3160c 100644 --- a/src/main/scala/io/delta/tables/DeltaTable.scala +++ b/src/main/scala/io/delta/tables/DeltaTable.scala @@ -142,7 +142,7 @@ class DeltaTable private[tables](df: Dataset[Row], deltaLog: DeltaLog) * * @param mode Specifies the mode for the generation of the manifest. * The valid modes are as follows (not case sensitive): - * - "symlink_manifest_format" : This will generate manifests in symlink format + * - "symlink_format_manifest" : This will generate manifests in symlink format * for Presto and Athena read support. * See the online documentation for more information. * @since 0.5.0 From 54643efc07dfaa9028d228dcad6502d59e4bdb3a Mon Sep 17 00:00:00 2001 From: Rahul Mahadev Date: Fri, 20 Dec 2019 18:14:14 +0000 Subject: [PATCH 42/44] [SC-24567][DELTA] Add additional metrics to Describe Delta History - Added a way to capture SQLMetrics and inject it into CommitInfo - Currently supports Writes and Merge - Guarded by feature flag Preview of describe history on Merge +-------+-------------------+------+--------+---------+--------------------+----+--------+---------+-----------+-----------------+-------------+--------------------+ |version| timestamp|userId|userName|operation| operationParameters| job|notebook|clusterId|readVersion| isolationLevel|isBlindAppend| operationalMetrics| +-------+-------------------+------+--------+---------+--------------------+----+--------+---------+-----------+-----------------+-------------+--------------------+ | 1|2019-12-19 11:16:24| null| null| MERGE|[predicate -> (s....|null| null| null| 0|WriteSerializable| false|[numTargetRowsCop...| | 0|2019-12-19 11:16:17| null| null| WRITE|[mode -> ErrorIfE...|null| null| null| null|WriteSerializable| true|[numFiles -> 2, n...| +-------+-------------------+------+--------+---------+--------------------+----+--------+---------+-----------+-----------------+-------------+--------------------+ Map(numTargetRowsCopied -> 0, numTargetRowsDeleted -> 0, numFiles -> 5, numTargetFilesAdded -> 5, numTargetRowsInserted -> 50, numTargetRowsUpdated -> 50, numOutputRows -> 100, numOutputBytes -> 2838, numSourceRows -> 100, numTargetFilesRemoved -> 1) - Added tests in `DeltaDescribeHistorySuite` Author: Rahul Mahadev GitOrigin-RevId: 177c4ac5b70ea2a49cdd24086700d32def66ed91 --- .../spark/sql/delta/DeltaOperations.scala | 16 ++++++ .../sql/delta/OptimisticTransaction.scala | 17 +++++- .../spark/sql/delta/actions/actions.scala | 11 ++-- .../commands/ConvertToDeltaCommand.scala | 3 +- .../sql/delta/commands/MergeIntoCommand.scala | 1 + .../sql/delta/files/SQLMetricsReporting.scala | 54 ++++++++++++++++++ .../sql/delta/files/TransactionalWrite.scala | 18 +++++- .../sql/delta/sources/DeltaSQLConf.scala | 7 +++ .../sql/delta/DescribeDeltaHistorySuite.scala | 56 +++++++++++++++++++ 9 files changed, 174 insertions(+), 9 deletions(-) create mode 100644 src/main/scala/org/apache/spark/sql/delta/files/SQLMetricsReporting.scala diff --git a/src/main/scala/org/apache/spark/sql/delta/DeltaOperations.scala b/src/main/scala/org/apache/spark/sql/delta/DeltaOperations.scala index 93e8fe4211a..3500ea2115a 100644 --- a/src/main/scala/org/apache/spark/sql/delta/DeltaOperations.scala +++ b/src/main/scala/org/apache/spark/sql/delta/DeltaOperations.scala @@ -38,6 +38,8 @@ object DeltaOperations { val parameters: Map[String, Any] lazy val jsonEncodedValues: Map[String, String] = parameters.mapValues(JsonUtils.toJson(_)) + + val metricParameters: Seq[String] = Seq() } /** Recorded during batch inserts. Predicates can be provided for overwrites. */ @@ -48,6 +50,11 @@ object DeltaOperations { override val parameters: Map[String, Any] = Map("mode" -> mode.name()) ++ partitionBy.map("partitionBy" -> JsonUtils.toJson(_)) ++ predicate.map("predicate" -> _) + + override val metricParameters: Seq[String] = Seq( + "numFiles", + "numOutputBytes", + "numOutputRows") } /** Recorded during streaming inserts. */ case class StreamingUpdate( @@ -107,6 +114,15 @@ object DeltaOperations { deletePredicate.map("deletePredicate" -> _).toMap ++ insertPredicate.map("insertPredicate" -> _).toMap } + override val metricParameters: Seq[String] = Seq( + "numSourceRows", + "numTargetRowsInserted", + "numTargetRowsUpdated", + "numTargetRowsDeleted", + "numTargetRowsCopied", + "numOutputRows", + "numTargetFilesAdded", + "numTargetFilesRemoved") } /** Recorded when an update operation is committed to the table. */ case class Update(predicate: Option[String]) extends Operation("UPDATE") { diff --git a/src/main/scala/org/apache/spark/sql/delta/OptimisticTransaction.scala b/src/main/scala/org/apache/spark/sql/delta/OptimisticTransaction.scala index aefa8d64d2f..426d4db1087 100644 --- a/src/main/scala/org/apache/spark/sql/delta/OptimisticTransaction.scala +++ b/src/main/scala/org/apache/spark/sql/delta/OptimisticTransaction.scala @@ -25,6 +25,7 @@ import scala.collection.mutable.{ArrayBuffer, HashSet} import scala.util.control.NonFatal import com.databricks.spark.util.TagDefinitions.TAG_LOG_STORE_CLASS +import org.apache.spark.sql.delta.DeltaOperations.Operation import org.apache.spark.sql.delta.actions._ import org.apache.spark.sql.delta.files._ import org.apache.spark.sql.delta.hooks.{GenerateSymlinkManifest, PostCommitHook} @@ -128,7 +129,7 @@ object OptimisticTransaction { * * This trait is not thread-safe. */ -trait OptimisticTransactionImpl extends TransactionalWrite { +trait OptimisticTransactionImpl extends TransactionalWrite with SQLMetricsReporting { import org.apache.spark.sql.delta.util.FileNames._ @@ -238,6 +239,17 @@ trait OptimisticTransactionImpl extends TransactionalWrite { snapshot.transactions.getOrElse(id, -1L) } + /** + * Return the operation metrics for the operation if it is enabled + */ + def getOperationMetrics(op: Operation): Option[Map[String, String]] = { + if (spark.conf.get(DeltaSQLConf.DELTA_HISTORY_METRICS_ENABLED)) { + Some(getMetricsForOperation(op)) + } else { + None + } + } + /** * Modifies the state of the log by adding a new commit that is based on a read at * the given `lastVersion`. In the case of a conflict with a concurrent writer this @@ -280,7 +292,8 @@ trait OptimisticTransactionImpl extends TransactionalWrite { Map.empty, Some(readVersion).filter(_ >= 0), None, - Some(isBlindAppend)) + Some(isBlindAppend), + getOperationMetrics(op)) finalActions = commitInfo +: finalActions } diff --git a/src/main/scala/org/apache/spark/sql/delta/actions/actions.scala b/src/main/scala/org/apache/spark/sql/delta/actions/actions.scala index 1876e8b8c31..363d9903f89 100644 --- a/src/main/scala/org/apache/spark/sql/delta/actions/actions.scala +++ b/src/main/scala/org/apache/spark/sql/delta/actions/actions.scala @@ -254,7 +254,8 @@ case class CommitInfo( readVersion: Option[Long], isolationLevel: Option[String], /** Whether this commit has blindly appended without caring about existing files */ - isBlindAppend: Option[Boolean]) extends Action with CommitMarker { + isBlindAppend: Option[Boolean], + operationMetrics: Option[Map[String, String]]) extends Action with CommitMarker { override def wrap: SingleAction = SingleAction(commitInfo = this) override def withTimestamp(timestamp: Long): CommitInfo = { @@ -296,7 +297,7 @@ object NotebookInfo { object CommitInfo { def empty(version: Option[Long] = None): CommitInfo = { - CommitInfo(version, null, None, None, null, null, None, None, None, None, None, None) + CommitInfo(version, null, None, None, null, null, None, None, None, None, None, None, None) } def apply( @@ -306,7 +307,8 @@ object CommitInfo { commandContext: Map[String, String], readVersion: Option[Long], isolationLevel: Option[String], - isBlindAppend: Option[Boolean]): CommitInfo = { + isBlindAppend: Option[Boolean], + operationMetrics: Option[Map[String, String]]): CommitInfo = { val getUserName = commandContext.get("user").flatMap { case "unknown" => None case other => Option(other) @@ -324,7 +326,8 @@ object CommitInfo { commandContext.get("clusterId"), readVersion, isolationLevel, - isBlindAppend + isBlindAppend, + operationMetrics ) } } diff --git a/src/main/scala/org/apache/spark/sql/delta/commands/ConvertToDeltaCommand.scala b/src/main/scala/org/apache/spark/sql/delta/commands/ConvertToDeltaCommand.scala index 7b7f221147e..231265b138b 100644 --- a/src/main/scala/org/apache/spark/sql/delta/commands/ConvertToDeltaCommand.scala +++ b/src/main/scala/org/apache/spark/sql/delta/commands/ConvertToDeltaCommand.scala @@ -319,7 +319,8 @@ abstract class ConvertToDeltaCommandBase( context, readVersion = None, isolationLevel = None, - isBlindAppend = None) + isBlindAppend = None, + None) val extraActions = Seq(commitInfo, Protocol(), metadata) val actions = extraActions.toIterator ++ addFiles diff --git a/src/main/scala/org/apache/spark/sql/delta/commands/MergeIntoCommand.scala b/src/main/scala/org/apache/spark/sql/delta/commands/MergeIntoCommand.scala index c066ed89f01..daad6593c67 100644 --- a/src/main/scala/org/apache/spark/sql/delta/commands/MergeIntoCommand.scala +++ b/src/main/scala/org/apache/spark/sql/delta/commands/MergeIntoCommand.scala @@ -135,6 +135,7 @@ case class MergeIntoCommand( filesToRewrite.map(_.remove) ++ newWrittenFiles } } + deltaTxn.registerSQLMetrics(spark, metrics) deltaTxn.commit( deltaActions, DeltaOperations.Merge( diff --git a/src/main/scala/org/apache/spark/sql/delta/files/SQLMetricsReporting.scala b/src/main/scala/org/apache/spark/sql/delta/files/SQLMetricsReporting.scala new file mode 100644 index 00000000000..7e9e02ff8a9 --- /dev/null +++ b/src/main/scala/org/apache/spark/sql/delta/files/SQLMetricsReporting.scala @@ -0,0 +1,54 @@ +/* + * Copyright 2019 Databricks, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.spark.sql.delta.files + +import org.apache.spark.sql.delta.DeltaOperations.Operation +import org.apache.spark.sql.delta.sources.DeltaSQLConf + +import org.apache.spark.sql.SparkSession +import org.apache.spark.sql.execution.metric.SQLMetric + +/** + * This trait is used to register SQL metrics for a Delta Operation. + * Registering will allow the metrics to be instrumented via the CommitInfo and is accessible via + * DescribeHistory + */ +trait SQLMetricsReporting { + + // Map of SQL Metrics + private var operationSQLMetrics = Map[String, SQLMetric]() + + /** + * Register SQL metrics for an operation by appending the supplied metrics map to the + * operationSQLMetrics map. + */ + def registerSQLMetrics(spark: SparkSession, metrics: Map[String, SQLMetric]): Unit = { + if (spark.conf.get(DeltaSQLConf.DELTA_HISTORY_METRICS_ENABLED)) { + operationSQLMetrics = operationSQLMetrics ++ metrics + } + } + + /** + * Get the metrics for an operation based on collected SQL Metrics and filtering out + * the ones based on the metric parameters for that operation. + */ + def getMetricsForOperation(operation: Operation): Map[String, String] = { + operationSQLMetrics = operationSQLMetrics.filterKeys(s => + operation.metricParameters.contains(s)) + operationSQLMetrics.transform((_, v) => v.value.toString) + } +} diff --git a/src/main/scala/org/apache/spark/sql/delta/files/TransactionalWrite.scala b/src/main/scala/org/apache/spark/sql/delta/files/TransactionalWrite.scala index 6fcd81a0b89..e1f33dbc712 100644 --- a/src/main/scala/org/apache/spark/sql/delta/files/TransactionalWrite.scala +++ b/src/main/scala/org/apache/spark/sql/delta/files/TransactionalWrite.scala @@ -16,17 +16,21 @@ package org.apache.spark.sql.delta.files +import scala.collection.mutable.ListBuffer + import org.apache.spark.sql.delta._ import org.apache.spark.sql.delta.actions._ import org.apache.spark.sql.delta.metering.DeltaLogging import org.apache.spark.sql.delta.schema._ +import org.apache.spark.sql.delta.sources.DeltaSQLConf import org.apache.hadoop.fs.Path import org.apache.spark.sql.Dataset import org.apache.spark.sql.catalyst.expressions.{Attribute, AttributeReference} import org.apache.spark.sql.execution._ -import org.apache.spark.sql.execution.datasources.FileFormatWriter +import org.apache.spark.sql.execution.datasources.{BasicWriteJobStatsTracker, FileFormatWriter, WriteJobStatsTracker} import org.apache.spark.sql.types.{ArrayType, MapType, StructType} +import org.apache.spark.util.SerializableConfiguration /** * Adds the ability to write files out as part of a transaction. Checks @@ -135,6 +139,16 @@ trait TransactionalWrite extends DeltaLogging { self: OptimisticTransactionImpl val physicalPlan = DeltaInvariantCheckerExec(queryExecution.executedPlan, invariants) + val statsTrackers: ListBuffer[WriteJobStatsTracker] = ListBuffer() + + if (spark.conf.get(DeltaSQLConf.DELTA_HISTORY_METRICS_ENABLED)) { + val basicWriteJobStatsTracker = new BasicWriteJobStatsTracker( + new SerializableConfiguration(spark.sessionState.newHadoopConf()), + BasicWriteJobStatsTracker.metrics) + registerSQLMetrics(spark, basicWriteJobStatsTracker.metrics) + statsTrackers.append(basicWriteJobStatsTracker) + } + FileFormatWriter.write( sparkSession = spark, plan = physicalPlan, @@ -144,7 +158,7 @@ trait TransactionalWrite extends DeltaLogging { self: OptimisticTransactionImpl hadoopConf = spark.sessionState.newHadoopConfWithOptions(metadata.configuration), partitionColumns = partitioningColumns, bucketSpec = None, - statsTrackers = Nil, + statsTrackers = statsTrackers, options = Map.empty) } diff --git a/src/main/scala/org/apache/spark/sql/delta/sources/DeltaSQLConf.scala b/src/main/scala/org/apache/spark/sql/delta/sources/DeltaSQLConf.scala index feaadd74c27..be3be7f9be1 100644 --- a/src/main/scala/org/apache/spark/sql/delta/sources/DeltaSQLConf.scala +++ b/src/main/scala/org/apache/spark/sql/delta/sources/DeltaSQLConf.scala @@ -130,6 +130,13 @@ object DeltaSQLConf { .intConf .createWithDefault(1000) + val DELTA_HISTORY_METRICS_ENABLED = + buildConf("history.metricsEnabled") + .doc("Enables Metrics reporting in Describe History. CommitInfo will now record the " + + "Operation Metrics.") + .booleanConf + .createWithDefault(false) + val DELTA_VACUUM_RETENTION_CHECK_ENABLED = buildConf("retentionDurationCheck.enabled") .doc("Adds a check preventing users from running vacuum with a very short retention " + diff --git a/src/test/scala/org/apache/spark/sql/delta/DescribeDeltaHistorySuite.scala b/src/test/scala/org/apache/spark/sql/delta/DescribeDeltaHistorySuite.scala index df4987f3fda..6dbeb919ca2 100644 --- a/src/test/scala/org/apache/spark/sql/delta/DescribeDeltaHistorySuite.scala +++ b/src/test/scala/org/apache/spark/sql/delta/DescribeDeltaHistorySuite.scala @@ -23,6 +23,7 @@ import org.scalatest.Tag import org.apache.spark.sql.{AnalysisException, Column, DataFrame, QueryTest, Row} import org.apache.spark.sql.execution.streaming.MemoryStream +import org.apache.spark.sql.functions._ import org.apache.spark.sql.test.SharedSparkSession import org.apache.spark.util.Utils @@ -277,6 +278,61 @@ trait DescribeDeltaHistorySuiteBase assertNotADeltaTableException(tempDir.getCanonicalPath) } } + + test("operation metrics - write metrics") { + withSQLConf(DeltaSQLConf.DELTA_HISTORY_METRICS_ENABLED.key -> "true") { + withTempDir { tempDir => + // create table + spark.range(100).repartition(5).write.format("delta").save(tempDir.getAbsolutePath) + val deltaTable = io.delta.tables.DeltaTable.forPath(tempDir.getAbsolutePath) + + // get last command history + val lastCmd = deltaTable.history(1) + + // Check if operation metrics from history are accurate + assert(lastCmd.select("operationMetrics.numFiles").take(1).head.getString(0).toLong + == 5) + + assert(lastCmd.select("operationMetrics.numOutputBytes").take(1).head.getString(0).toLong + > 0) + + assert(lastCmd.select("operationMetrics.numOutputRows").take(1).head.getString(0).toLong + == 100) + } + } + } + + test("operation metrics - merge") { + withSQLConf(DeltaSQLConf.DELTA_HISTORY_METRICS_ENABLED.key -> "true") { + withTempDir { tempDir => + // create target + spark.range(100).write.format("delta").save(tempDir.getAbsolutePath) + val deltaTable = io.delta.tables.DeltaTable.forPath(tempDir.getAbsolutePath) + + // run merge + deltaTable.as("t") + .merge(spark.range(50, 150).toDF().as("s"), "s.id = t.id") + .whenMatched() + .updateAll() + .whenNotMatched() + .insertAll() + .execute() + + // Get operation metrics + val lastCommand = deltaTable.history(1) + val operationMetrics: Map[String, String] = lastCommand.select("operationMetrics") + .take(1) + .head + .getMap(0) + .asInstanceOf[Map[String, String]] + + assert(operationMetrics("numTargetRowsInserted") == "50") + assert(operationMetrics("numTargetRowsUpdated") == "50") + assert(operationMetrics("numOutputRows") == "100") + assert(operationMetrics("numSourceRows") == "100") + } + } + } } class DescribeDeltaHistorySuite From d9be0a45f5286c1cce0ead0381f2836c17e990c3 Mon Sep 17 00:00:00 2001 From: Rahul Mahadev Date: Thu, 2 Jan 2020 22:00:44 +0000 Subject: [PATCH 43/44] [SC-27618][DELTA] Fix package names for DML Java Suite Fix package names for DML commands Java suite to have package `test.org.apache.spark.sql.delta` instead of `test.com.databricks.sql.transaction.tahoe` Ran test builders Closes https://github.com/delta-io/delta/pull/295 Closes https://github.com/delta-io/delta/issues/290 Author: Rahul Mahadev GitOrigin-RevId: 92f0ab08e238b182c76c24456fe276a79e4f82e1 --- src/test/java/org/apache/spark/sql/delta/DeleteJavaSuite.java | 2 +- .../java/org/apache/spark/sql/delta/MergeIntoJavaSuite.java | 2 +- src/test/java/org/apache/spark/sql/delta/UpdateJavaSuite.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/org/apache/spark/sql/delta/DeleteJavaSuite.java b/src/test/java/org/apache/spark/sql/delta/DeleteJavaSuite.java index 8dbe099b35c..87de57ad165 100644 --- a/src/test/java/org/apache/spark/sql/delta/DeleteJavaSuite.java +++ b/src/test/java/org/apache/spark/sql/delta/DeleteJavaSuite.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package test.com.databricks.sql.transaction.tahoe; +package test.org.apache.spark.sql.delta; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/test/java/org/apache/spark/sql/delta/MergeIntoJavaSuite.java b/src/test/java/org/apache/spark/sql/delta/MergeIntoJavaSuite.java index 2abeb9ea44e..bc2ce18566a 100644 --- a/src/test/java/org/apache/spark/sql/delta/MergeIntoJavaSuite.java +++ b/src/test/java/org/apache/spark/sql/delta/MergeIntoJavaSuite.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package test.com.databricks.sql.transaction.tahoe; +package test.org.apache.spark.sql.delta; import java.io.Serializable; import java.util.Arrays; diff --git a/src/test/java/org/apache/spark/sql/delta/UpdateJavaSuite.java b/src/test/java/org/apache/spark/sql/delta/UpdateJavaSuite.java index e0050012a0d..a2eddf3e42c 100644 --- a/src/test/java/org/apache/spark/sql/delta/UpdateJavaSuite.java +++ b/src/test/java/org/apache/spark/sql/delta/UpdateJavaSuite.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package test.com.databricks.sql.transaction.tahoe; +package test.org.apache.spark.sql.delta; import java.util.*; From 701ced7d227f5794115608acbe16a473a92faa8f Mon Sep 17 00:00:00 2001 From: lajin Date: Mon, 6 Jan 2020 17:28:35 +0800 Subject: [PATCH 44/44] trivial fix --- .../org/apache/spark/sql/delta/DeltaLogFileIndex.scala | 7 +++++++ .../spark/sql/delta/commands/UpdateWithJoinCommand.scala | 2 +- .../spark/sql/delta/hooks/GenerateSymlinkManifest.scala | 5 ++--- version.sbt | 2 +- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/scala/org/apache/spark/sql/delta/DeltaLogFileIndex.scala b/src/main/scala/org/apache/spark/sql/delta/DeltaLogFileIndex.scala index 843f8e8a0a1..b0ced21117b 100644 --- a/src/main/scala/org/apache/spark/sql/delta/DeltaLogFileIndex.scala +++ b/src/main/scala/org/apache/spark/sql/delta/DeltaLogFileIndex.scala @@ -48,6 +48,13 @@ case class DeltaLogFileIndex(format: FileFormat, files: Array[FileStatus]) exten override val sizeInBytes: Long = files.map(_.getLen).sum override def partitionSchema: StructType = new StructType() + + override def listFiles( + partitionFilters: Seq[Expression], + dynamicPartitionFilters: Seq[Expression], + dataFilters: Seq[Expression]): Seq[PartitionDirectory] = { + listFiles(partitionFilters, dataFilters) + } } object DeltaLogFileIndex { diff --git a/src/main/scala/org/apache/spark/sql/delta/commands/UpdateWithJoinCommand.scala b/src/main/scala/org/apache/spark/sql/delta/commands/UpdateWithJoinCommand.scala index a39afa6618e..9d053be8d2d 100644 --- a/src/main/scala/org/apache/spark/sql/delta/commands/UpdateWithJoinCommand.scala +++ b/src/main/scala/org/apache/spark/sql/delta/commands/UpdateWithJoinCommand.scala @@ -173,7 +173,7 @@ case class UpdateWithJoinCommand( // Calculate frequency of matches per source row val matchedRowCounts = collectTouchedFiles.groupBy(ROW_ID_COL).agg(sum("one").as("count")) if (matchedRowCounts.filter("count > 1").count() != 0) { - throw DeltaErrors.multipleSourceRowMatchingTargetRowInMergeException + throw DeltaErrors.multipleSourceRowMatchingTargetRowInMergeException(spark) } // Get the AddFiles using the touched file names. diff --git a/src/main/scala/org/apache/spark/sql/delta/hooks/GenerateSymlinkManifest.scala b/src/main/scala/org/apache/spark/sql/delta/hooks/GenerateSymlinkManifest.scala index 54ff6860fb7..f194d58b873 100644 --- a/src/main/scala/org/apache/spark/sql/delta/hooks/GenerateSymlinkManifest.scala +++ b/src/main/scala/org/apache/spark/sql/delta/hooks/GenerateSymlinkManifest.scala @@ -22,7 +22,6 @@ import org.apache.spark.sql.delta.metering.DeltaLogging import org.apache.spark.sql.delta.storage.LogStore import org.apache.spark.sql.delta.util.DeltaFileOperations import org.apache.hadoop.fs.Path - import org.apache.spark.SparkEnv import org.apache.spark.sql._ import org.apache.spark.sql.catalyst.analysis.UnresolvedAttribute @@ -30,7 +29,7 @@ import org.apache.spark.sql.catalyst.catalog.ExternalCatalogUtils import org.apache.spark.sql.catalyst.expressions.{Attribute, Cast, Concat, Expression, Literal, ScalaUDF} import org.apache.spark.sql.execution.datasources.InMemoryFileIndex import org.apache.spark.sql.functions.col -import org.apache.spark.sql.types.StringType +import org.apache.spark.sql.types.{BooleanType, StringType} import org.apache.spark.util.SerializableConfiguration /** @@ -336,7 +335,7 @@ trait GenerateSymlinkManifestImpl extends PostCommitHook with DeltaLogging with ExternalCatalogUtils.getPartitionPathString _, StringType, Seq(Literal(colName), Cast(col, StringType, Option(timeZoneId))), - Seq(true, true)) + Seq(BooleanType, BooleanType)) if (i == 0) Seq(partitionName) else Seq(Literal(Path.SEPARATOR), partitionName) } ) diff --git a/version.sbt b/version.sbt index c73221b08f8..999958d380c 100644 --- a/version.sbt +++ b/version.sbt @@ -1 +1 @@ -version in ThisBuild := "0.5.1.carmel0.1-SNAPSHOT" \ No newline at end of file +version in ThisBuild := "0.5.0.carmel0.1-SNAPSHOT" \ No newline at end of file

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