开发者社区 > 大数据与机器学习 > 大数据计算 MaxCompute > 正文

使用maxcompute开发ODPS Spark任务,使用spark.sql 无法 rename分区

使用maxcompute开发ODPS Spark任务,使用spark.sql 执行rename分区 sql: alter table $tableName partition(date='$dateFrom',source_id=$sourceFrom) rename to partition(date='$dateTo',source_id=$sourceTo), 任务报错退出。

报错信息如下:

org.apache.spark.sql.AnalysisException: ALTER TABLE RENAME PARTITION is only supported with v1 tables.
    at org.apache.spark.sql.catalyst.analysis.ResolveSessionCatalog.org$apache$spark$sql$catalyst$analysis$ResolveSessionCatalog$$parseV1Table(ResolveSessionCatalog.scala:588) ~[spark-sql_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.catalyst.analysis.ResolveSessionCatalog$$anonfun$apply$1.applyOrElse(ResolveSessionCatalog.scala:472) ~[spark-sql_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.catalyst.analysis.ResolveSessionCatalog$$anonfun$apply$1.applyOrElse(ResolveSessionCatalog.scala:48) ~[spark-sql_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper.$anonfun$resolveOperatorsUp$3(AnalysisHelper.scala:90) ~[spark-catalyst_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(TreeNode.scala:73) ~[spark-catalyst_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper.$anonfun$resolveOperatorsUp$1(AnalysisHelper.scala:90) ~[spark-catalyst_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper$.allowInvokingTransformsInAnalyzer(AnalysisHelper.scala:221) ~[spark-catalyst_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper.resolveOperatorsUp(AnalysisHelper.scala:86) ~[spark-catalyst_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper.resolveOperatorsUp$(AnalysisHelper.scala:84) ~[spark-catalyst_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan.resolveOperatorsUp(LogicalPlan.scala:29) ~[spark-catalyst_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.catalyst.analysis.ResolveSessionCatalog.apply(ResolveSessionCatalog.scala:48) ~[spark-sql_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.catalyst.analysis.ResolveSessionCatalog.apply(ResolveSessionCatalog.scala:39) ~[spark-sql_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.catalyst.rules.RuleExecutor.$anonfun$execute$2(RuleExecutor.scala:216) ~[spark-catalyst_2.12-3.1.1.jar:3.1.1]
    at scala.collection.LinearSeqOptimized.foldLeft(LinearSeqOptimized.scala:126) ~[scala-library-2.12.10.jar:?]
    at scala.collection.LinearSeqOptimized.foldLeft$(LinearSeqOptimized.scala:122) ~[scala-library-2.12.10.jar:?]
    at scala.collection.immutable.List.foldLeft(List.scala:89) ~[scala-library-2.12.10.jar:?]
    at org.apache.spark.sql.catalyst.rules.RuleExecutor.$anonfun$execute$1(RuleExecutor.scala:213) ~[spark-catalyst_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.catalyst.rules.RuleExecutor.$anonfun$execute$1$adapted(RuleExecutor.scala:205) ~[spark-catalyst_2.12-3.1.1.jar:3.1.1]
    at scala.collection.immutable.List.foreach(List.scala:392) ~[scala-library-2.12.10.jar:?]
    at org.apache.spark.sql.catalyst.rules.RuleExecutor.execute(RuleExecutor.scala:205) ~[spark-catalyst_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.catalyst.analysis.Analyzer.org$apache$spark$sql$catalyst$analysis$Analyzer$$executeSameContext(Analyzer.scala:196) ~[spark-catalyst_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.catalyst.analysis.Analyzer.execute(Analyzer.scala:190) ~[spark-catalyst_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.catalyst.analysis.Analyzer.execute(Analyzer.scala:155) ~[spark-catalyst_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.catalyst.rules.RuleExecutor.$anonfun$executeAndTrack$1(RuleExecutor.scala:183) ~[spark-catalyst_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.catalyst.QueryPlanningTracker$.withTracker(QueryPlanningTracker.scala:88) ~[spark-catalyst_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.catalyst.rules.RuleExecutor.executeAndTrack(RuleExecutor.scala:183) ~[spark-catalyst_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.catalyst.analysis.Analyzer.$anonfun$executeAndCheck$1(Analyzer.scala:174) ~[spark-catalyst_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper$.markInAnalyzer(AnalysisHelper.scala:228) ~[spark-catalyst_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.catalyst.analysis.Analyzer.executeAndCheck(Analyzer.scala:173) ~[spark-catalyst_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.execution.QueryExecution.$anonfun$analyzed$1(QueryExecution.scala:73) ~[spark-sql_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.catalyst.QueryPlanningTracker.measurePhase(QueryPlanningTracker.scala:111) ~[spark-catalyst_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.execution.QueryExecution.$anonfun$executePhase$1(QueryExecution.scala:143) ~[spark-sql_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.SparkSession.withActive(SparkSession.scala:772) ~[spark-sql_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.execution.QueryExecution.executePhase(QueryExecution.scala:143) ~[spark-sql_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.execution.QueryExecution.analyzed$lzycompute(QueryExecution.scala:73) ~[spark-sql_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.execution.QueryExecution.analyzed(QueryExecution.scala:71) ~[spark-sql_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.execution.QueryExecution.assertAnalyzed(QueryExecution.scala:63) ~[spark-sql_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.Dataset$.$anonfun$ofRows$2(Dataset.scala:98) ~[spark-sql_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.SparkSession.withActive(SparkSession.scala:772) ~[spark-sql_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.Dataset$.ofRows(Dataset.scala:96) ~[spark-sql_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.SparkSession.$anonfun$sql$1(SparkSession.scala:615) ~[spark-sql_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.SparkSession.withActive(SparkSession.scala:772) ~[spark-sql_2.12-3.1.1.jar:3.1.1]
    at org.apache.spark.sql.SparkSession.sql(SparkSession.scala:610) ~[spark-sql_2.12-3.1.1.jar:3.1.1]

展开
收起
岚沨 2024-03-14 18:24:41 129 0
4 条回答
写回答
取消 提交回答
  • 根据错误信息,ALTER TABLE RENAME PARTITION操作仅支持v1表。这意味着在MaxCompute中,Spark SQL目前可能不支持对分区表进行重命名操作。您需要考虑使用MaxCompute提供的原生命令或SDK来进行分区重命名操作。

    2024-03-15 14:23:16
    赞同 展开评论 打赏
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    根据报错信息,问题出在执行alter table $tableName partition(date='$dateFrom',source_id=$sourceFrom) rename to partition(date='$dateTo',source_id=$sourceTo)这条SQL语句时,提示ALTER TABLE RENAME PARTITION is only supported with v1 tables.,即仅支持v1表的分区重命名操作。

    要解决这个问题,你可以尝试以下方法:

    1. 将表升级为v1表。你可以使用以下命令升级表:
    ALTER TABLE $tableName SET PROPERTIES('version'='1');
    
    1. 使用ALTER TABLE命令分别重命名分区。首先删除旧分区,然后添加新分区:
    ALTER TABLE $tableName DROP PARTITION (date='$dateFrom', source_id=$sourceFrom);
    ALTER TABLE $tableName ADD PARTITION (date='$dateTo', source_id=$sourceTo) LOCATION '新的分区路径';
    

    注意:请将新的分区路径替换为实际的新分区路径。

    2024-03-15 13:40:13
    赞同 展开评论 打赏
  • 在使用MaxCompute开发ODPS Spark任务时,如果使用spark.sql执行rename分区操作,可能会遇到任务报错退出的情况。这可能是因为MaxCompute的分区表不支持直接使用ALTER ABLE语句进行分区重方法:

    1. 使用MaxCaxCompute控制台或命令行工具手动重命名分区。具体操作步骤如下:

      • 登录MaxCompute控制台。
      • 选择目标表所在的项目和工作空间。
      • 在左侧导航栏中,找到并点击“分区管理”。
      • 在分区管理页面中,找到需要重命名的分区,点击“更多”按钮,然后选择“重命名分区”。
      • 输入新的分区名称,然后点击“确定”按钮。
    2. 使用Spark SQL读取原始分区数据,然后将数据写入新的分区。具体操作步骤如下:

      • 使用Spark SQL读取原始分区数据:

        from pyspark.sql import SparkSession
        
        spark = SparkSession.builder \n         .appName("Rename Partition") \n         .getOrCreate()
        
        table_name = "your_table_name"
        date_from = "your_date_from"
        source_from = "your_source_from"
        date_to = "your_date_to"
        source_to = "your_source_to"
        
        df = spark.sql(f"SELECT * FROM {table_name} WHERE date='{date_from}' AND source_id='{source_from}'")
        
      • 将数据写入新的分区:

        df.write.partitionBy("date", "source_id").mode("overwrite").saveAable(tame)
        
      • 最后,删除原始分区:

        spark.sql(f"ALTER TABLE {table_name} DROP PARTITION (date='{date_from}', source_id='{source_from}')")
        

    希望以上方法能帮助你解决问题。

    2024-03-15 07:43:51
    赞同 展开评论 打赏
  • 阿里云大降价~

    在使用MaxCompute开发ODPS Spark任务时,如果使用spark.sql执行rename分区操作,可能会遇到任务报错退出的情况。这可能是因为MaxCompute的分区表不支持直接使用spark.sql进行分重命名操作。

    为了解决这个问题,你可以尝试以下方法:

    1. 使用MaxCompute的SQL语法进行分区重命名操作。在MaxCompute中,可以使用ALTER TABLE语句来重命名分区。例如:
    ALTER TABLE tableName RENAME PARTITION (date='dateFrom', source_id=sourceFrom) TO PARTITION (date='dateTo', source_id=sourceTo);
    
    1. 使用MaxCompute的Python SDK进行分区重命名操作。你可以使用MaxCompute的Python SDK(odps库)来执行分区重命名操作。首先,确保已经安装了odps库,然后使用以下代码:
    from odps import ODPS
    
    # 创建ODPS实例
    odps = ODPS('<your-access-id>', '<your-access-key>', '<your-project>', endpoint='http://service.odps.aliyun.com/api')
    
    # 获取表对象
    table = odps.get_table('tableName')
    
    # 执行分区重命名操作
    table.alter_partition('dateFrom', 'sourceFrom').rename_to('dateTo', 'sourceTo')
    

    注意:请将<your-access-id><your-access-key><your-project>替换为你的MaxCompute项目的实际信息。

    2024-03-14 20:17:35
    赞同 展开评论 打赏

MaxCompute(原ODPS)是一项面向分析的大数据计算服务,它以Serverless架构提供快速、全托管的在线数据仓库服务,消除传统数据平台在资源扩展性和弹性方面的限制,最小化用户运维投入,使您经济并高效的分析处理海量数据。

相关产品

  • 云原生大数据计算服务 MaxCompute
  • 相关电子书

    更多
    SQL Server 2017 立即下载
    GeoMesa on Spark SQL 立即下载
    原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载