我在EMR 5.21上使用Spark 2.4.0
我正在使用S3上的分区表-我注意到的是以下内容。
如果我使用以下方法加载数据:
spark.read.parquet("s3://my_bucket/my_table").createOrReplaceTempView("my_table");
我可以轻松地执行以下操作:
spark.sql("select * from my_table").show
并获得结果。
spark.sql("show tables").show
的结果中还会显示“ my_table”。
我注意到的是以下无效:
scala> spark.sql("show create table my_table").show
org.apache.spark.sql.catalyst.analysis.NoSuchTableException: Table or view 'my_table' not found in database 'default';
at org.apache.spark.sql.catalyst.catalog.SessionCatalog.requireTableExists(SessionCatalog.scala:185)
at org.apache.spark.sql.catalyst.catalog.SessionCatalog.getTableMetadata(SessionCatalog.scala:428)
at org.apache.spark.sql.execution.command.ShowCreateTableCommand.run(tables.scala:915)
at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult$lzycompute(commands.scala:70)
最重要的是,由于我希望分区可用:
scala> spark.sql("msck repair table my_table").show
org.apache.spark.sql.catalyst.analysis.NoSuchTableException: Table or view 'my_table' not found in database 'default';
at org.apache.spark.sql.catalyst.catalog.SessionCatalog.requireTableExists(SessionCatalog.scala:185)
at org.apache.spark.sql.catalyst.catalog.SessionCatalog.getTableMetadata(SessionCatalog.scala:428)
at org.apache.spark.sql.execution.command.AlterTableRecoverPartitionsCommand.run(ddl.scala:600)
at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult$lzycompute(commands.scala:70)
at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult(commands.scala:68)
有帮助吗?就我要完成的工作而言,我将spark.sql.sources.partitionOverwriteMode
设置为动态,并使用
some_df
.write
.option("compression", "snappy")
.format("parquet")
.mode(SaveMode.Overwrite)
.insertInto("my_table")
要更新我的S3表上的分区。