开发者社区> 问答> 正文

请问一下,Maxcompute创建oss外部表,oss为归档存储和冷归档存储,数据可以写入,查询的时

请问一下,Maxcompute创建oss外部表,oss为归档存储和冷归档存储,数据可以写入,查询的时候就显示load ddl错误,请问这个要怎么解决?1544问.png

展开
收起
游客3oewgrzrf6o5c 2022-07-14 16:52:51 1216 0
17 条回答
写回答
取消 提交回答
  • 在阿里云MaxCompute中创建OSS外部表,如果OSS存储使用的是归档存储或冷归档存储,可能会出现这种情况。这是因为归档存储和冷归档存储在读取数据时需要进行解冻操作,而MaxCompute目前不支持直接对归档存储和冷归档存储进行解冻操作。

    为了解决这个问题,您可以通过将归档存储和冷归档存储中的数据先拷贝到普通的OSS存储中,再创建外部表来解决。具体步骤如下:

    1. 将归档存储或冷归档存储中的数据拷贝到普通的OSS存储中。您可以使用阿里云OSS控制台或者ossutil等工具进行拷贝操作。

    2. 在MaxCompute中创建外部表,并指定OSS普通存储中的数据路径。例如,您可以使用以下命令创建外部表:

      CREATE EXTERNAL TABLE my_table (
       col1 string,
       col2 string,
       col3 string
      )
      STORED BY 'com.aliyun.odps.OssStorageHandler'
      LOCATION 'oss://my-bucket/my-path/'
      

      其中,my-bucket是您的OSS存储桶名称,my-path是您在OSS存储桶中存储数据的路径。

    3. 使用SELECT语句查询外部表中的数据。例如,您可以使用以下命令查询外部表:

      SELECT * FROM my_table
      

    将归档存储或冷归档存储中的数据拷贝到普通的OSS存储中可能会产生额外的数据存储费用。因此,在进行这种操作时,建议您仔细评估数据存储成本和查询效率,并根据实际情况进行选择。

    2023-05-31 14:02:22
    赞同 展开评论 打赏
  • 在MaxCompute中创建OSS外部表时,需要保证OSS外部表的列信息与实际OSS存储文件的列信息一致,否则会导致load DDL错误。

    首先,可以通过以下方法确定OSS文件的列信息:

    1. 登录阿里云控制台,进入OSS控制台,找到对应的Bucket,选择相应的文件,下载到本地。

    2. 打开文件,查看文件的列信息,确保与外部表定义的列信息一致。

      经常出现的一种情况是,OSS外部表的定义列名与文件列名不一致,此时需要根据实际文件列信息重新定义OSS外部表的列信息。

    如果您已确认OSS外部表的列信息与实际OSS存储文件的列信息一致,但仍然出现load DDL错误,可以尝试以下方法:

    1. 检查MaxCompute连接信息是否正确

      当您在创建OSS外部表时,需要输入OSS存储文件的地址,如果地址信息填写错误,load DDL会报错。您可以通过检查连接信息,验证OSS存储地址是否正确。

    2. 检查OSS存储文件的访问权限

      当OSS存储文件的ACL(对象访问控制)为私有时,需要提供相应的访问秘钥信息。您可以在创建OSS外部表时,传递accessKeyId和accessKeySecret参数,来访问私有的OSS存储文件。

    3. 尝试使用其他工具查看OSS文件

      如果您仍然无法确定OSS外部表的列信息是否正确,可以使用OSS官方提供的工具(如OSS Browser、OSSFS 等),或者其他OSS文件查看工具,来查看文件的列信息。

    2023-05-27 12:41:02
    赞同 展开评论 打赏
  • 从事java行业9年至今,热爱技术,热爱以博文记录日常工作,csdn博主,座右铭是:让技术不再枯燥,让每一位技术人爱上技术

    你好,根据错误提示count not load ddl来看应是在执行数据库定义语句,比如create、alter、drop等报错,不是查询语句的问题,建议排查一下对应的ddl操作语句是否有问题;另外从错误码ODPS-0110999来分析错误原因:MaxCompute没有并发控制,可能有多个任务在修改这张表,这种情况下,有极小的概率在最后的META操作时,发生并发冲突导致执行异常,同时ALTER、INSERT操作都会发生此情况。错误码也可以看出来应不是查询语句的问题。

    2023-05-26 17:45:18
    赞同 展开评论 打赏
  • 公众号:网络技术联盟站,InfoQ签约作者,阿里云社区签约作者,华为云 云享专家,BOSS直聘 创作王者,腾讯课堂创作领航员,博客+论坛:https://www.wljslmz.cn,工程师导航:https://www.wljslmz.com

    在创建OSS外部表时,需要注意以下几点:

    1. 确认外部表指向的路径是否正确,包括Bucket名称和Object名称,建议使用完整的oss://bucket-name/object-path路径。

    2. 确认OSS外部表是否已经在MaxCompute中授权,需要使用授权账号或者Aliyun dataworks(工作空间)等授权机制进行授权。

    3. 对于OSS归档存储和冷归档存储的数据,需要将需要查询的Object首先恢复为可读取状态,才能在外部表中正常查询。可以使用以下命令进行恢复:

      ossutil restore oss://bucket/object --restore-days <Days>
      
    4. 如果在使用SELECT查询外部表时仍然遇到load ddl错误,可以尝试使用set odps.sql.hive.compatible=true;开启Hive兼容模式,在一些情况下可以解决load ddl错误。例如:

      set odps.sql.hive.compatible=true;
      SELECT * FROM external_table_name;
      
    2023-05-26 16:53:55
    赞同 展开评论 打赏
  • 资深技术专家,全网粉丝10W+。主攻技术开发,擅长分享、写文、测评。

    当在MaxCompute中创建OSS外部表时,数据可以成功写入,但在查询时显示"load ddl错误"可能有以下几个原因:

    表的DDL定义不正确:请确保在创建外部表时,DDL定义与实际的数据存储格式和结构相匹配。特别是,要确保指定了正确的列名、数据类型和分隔符等信息。

    数据路径或文件格式问题:确认在创建外部表时指定了正确的OSS数据路径和文件格式。如果数据以非支持的文件格式存储在OSS上,或者路径不正确,就会导致查询时出现加载DDL错误。

    访问权限问题:确保在创建外部表时,MaxCompute具有足够的权限访问OSS上的数据。如果访问权限不正确或被限制,查询过程中可能会出现加载DDL错误。

    2023-05-21 23:45:33
    赞同 展开评论 打赏
  • 发表文章、提出问题、分享经验、结交志同道合的朋友

    你好,可能是因为在创建外部表时没有正确指定归档存储类型的选择。在使用OSS作为外部存储时,需要将存储类型设置为归档存储或冷归档存储,否则会出现查询时ddl错误的情况。

    2023-05-19 14:33:08
    赞同 展开评论 打赏
  • 在MaxCompute中创建OSS外部表时,如果OSS为归档存储或冷归档存储类型,需要注意以下几个问题:

    1. 由于归档存储和冷归档存储的数据在存储时会自动进行压缩和归档,因此在创建OSS外部表时,需要指定对应的压缩格式和文件格式。例如,如果OSS存储的是Gzip格式的数据,可以在创建外部表时指定文件格式为gzip。

    2. 在使用OSS外部表时,需要使用MaxCompute的Tunnel功能将OSS中的数据导入到MaxCompute中,然后在MaxCompute中进行查询。需要注意的是,在使用Tunnel导入数据时,需要指定对应的压缩格式和文件格式。

    3. 如果您在创建OSS外部表时使用了自定义Schema,需要确保Schema的字段数量和类型与实际数据一致,否则可能会导致load ddl错误。

    以下是一个示例代码,用于创建OSS外部表,并使用Tunnel将数据导入MaxCompute中:

    from odps import ODPS
    from odps import options
    from odps.tunnel import TableTunnel
    from odps.tunnel.io import RecordReader
    options.sql.use_odps2_extension = True
    # 设置MaxCompute账号信息
    access_id = 'your_access_id'
    access_key = 'your_access_key'
    project_name = 'your_project_name'
    end_point = 'your_end_point'
    # 初始化MaxCompute对象
    odps = ODPS(access_id=access_id, secret_access_key=access_key, project=project_name, endpoint=end_point)
    # 创建OSS外部表
    odps.execute_sql('CREATE EXTERNAL TABLE my_external_table(col1 STRING, col2 BIGINT) '
                     'STORED BY \'com.aliyun.odps.OssStorage\' '
                     'LOCATION \'oss://your_bucket/your_folder/\' '
                     'WITH SERDEPROPERTIES (\'odps.io.compression.type\'=\'gzip\')')
    # 使用Tunnel将数据导入MaxCompute中
    tunnel = TableTunnel(odps)
    table = tunnel.create_upload_session('your_project_name', 'my_external_table').open_record_writer()
    reader = RecordReader(tunnel, 'your_project_name', 'my_external_table', compress_option='gzip')
    for record in reader:
        table.write(record)
    table.close()
    

    在以上示例代码中,使用CREATE EXTERNAL TABLE语句创建了一个名为my_external_table的外部表,外部表的数据存储在OSS的your_bucket/your_folder/目录下,数据格式为gzip压缩格式。然后,使用Tunnel将OSS中的数据导入到MaxCompute中。在导入数据时,使用RecordReader读取OSS中的数据,并使用RecordWriter将数据写入MaxCompute中。

    2023-05-19 08:31:09
    赞同 展开评论 打赏
  • 天下风云出我辈,一入江湖岁月催,皇图霸业谈笑中,不胜人生一场醉。

    在MaxCompute中创建OSS外部表时,如果OSS存储类型为归档存储或冷归档存储,写入数据时会正常,但查询时可能报“LOAD DDL”错误。这是因为归档存储和冷归档存储的数据需要先恢复才可以读取,而MaxCompute外部表默认使用OSS的低频访问存储,不会自动触发数据恢复。 要解决此问题,有以下两种方式: 1. 创建OSS外部表时指定存储类型为"ARCHIVE"或"DEEP_ARCHIVE" 在创建外部表的DDL语句中,通过LOCATION指定OSS路径时,需要指明存储类型,例如: sql CREATE EXTERNAL TABLE oss_table ( col1 STRING ) STORED BY 'com.aliyun.odps.mapred.mapper.OSSFileMapper' -- 指定OSSFileMapper WITH SERDEPROPERTIES ( 'odps.properties.rolearn'='acs:ram::112233445566:role/aliyunodpsdefaultrole', -- OSS角色 'odps.properties.fs.oss.access.key.id'='xxx', -- OSS AccessKey 'odps.properties.fs.oss.access.key.secret'='xxx', 'odps.properties.fs.oss.endpoint'='oss-cn-beijing.aliyuncs.com', -- OSS endpoint 'odps.properties.location' = 'oss://my-bucket/path ARCHIVE' -- 指定ARCHIVE存储类型 ); 创建完成后,查询该表时会自动触发OSS数据恢复,然后读取数据。 2. 查询表前显式调用归档数据恢复API 如果外部表创建时没有指定存储类型,也可以在查询表前,通过MaxCompute中的归档数据恢复API将OSS数据恢复,然后再查询外部表。 调用方式如下: sql -- 恢复OSS上my-bucket的所有归档数据 CALL oss_restore_archive_data('acs:oss:::my-bucket', '', -1);

    -- 等待恢复完成后,查询外部表 SELECT * FROM oss_table;

    2023-05-18 17:08:59
    赞同 展开评论 打赏
  • 值得去的地方都没有捷径

    这个错误提示可能是由于MaxCompute无法正确加载DDL状态引起的。您可以尝试以下解决方法:

    确保您使用的是支持oss外部表的MaxCompute版本,并且您的oss存储桶已经正确配置。

    确认您的DDL语句是否正确,包括数据类型、分隔符、列名等。

    检查您的oss存储桶是否有足够的权限让MaxCompute可以读取数据。

    如果您使用的是归档存储或冷归档存储,您需要先将数据从归档存储或冷归档存储中解冻出来,然后再进行查询。

    如果以上方法都无法解决问题,您可以尝试使用其他方式查询数据,例如使用MaxCompute Tunnel或者其他数据处理工具。

    如果您仍然无法解决问题,请联系MaxCompute官方客服寻求帮助。

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

    MaxCompute 可以通过创建 OSS 外部表来直接读取存储在 OSS 上的数据。对于归档存储和冷归档存储,可以使用相应的 OSS 存储类型进行配置。需要注意的是,在查询数据时,由于归档存储和冷归档存储的特殊性,可能会有一些限制或者性能损失。

    以下是一个简单的示例,演示如何将 OSS 中的 CSV 数据创建为 MaxCompute 的外部表:

    1. 首先,创建一个存储在 OSS 中的 CSV 文件,例如:
    oss://example-bucket/test.csv
    
    1. 然后,在 MaxCompute 中创建一个外部表,指向该文件,例如:
    CREATE EXTERNAL TABLE mytable (
      id STRING,
      name STRING,
      age INT
    ) WITH SERDEPROPERTIES (
      'separatorChar' = ','
    ) LOCATION 'oss://example-bucket/test.csv';
    

    需要注意的是,这里使用了 LOCATION 参数来指定外部表所在的位置。同时,还可以使用 WITH SERDEPROPERTIES 参数来指定文件格式等相关属性。

    1. 接着,可以使用 SQL 语句查询该表,例如:
    SELECT * FROM mytable;
    

    需要注意的是,在查询过程中,如果存储在 OSS 上的数据较大,可能会导致查询性能较慢。此外,对于归档存储和冷归档存储,需要在查询时进行相应的解冻操作,才能读取数据。因此,在实际应用中,需要根据数据量和存储类型等因素进行相应的优化和调整。

    总之,通过创建外部表,MaxCompute 可以直接读取存储在 OSS 上的数据,并进行相关的处理和分析。同时,还可以使用一些高级特性,例如分区、压缩等,来进一步优化数据的存储和查询性能。

    2023-05-16 22:48:49
    赞同 展开评论 打赏
  • 云端行者觅知音, 技术前沿我独行。 前言探索无边界, 阿里风光引我情。

    在阿里云MaxCompute中创建OSS外部表时,如果出现"Critical! Internal error happened- Could not load ddl state from edits, Op internal state undetermined"错误,可能是由于以下原因导致的:

    1、OSS存储桶的访问权限不正确,导致MaxCompute无法读取或写入数据。

    2、OSS存储桶中的数据格式不正确,导致MaxCompute无法正确解析数据。

    3、MaxCompute的版本不兼容,导致无法正确读取或写入OSS外部表。

    如果您仍然无法解决问题,请联系阿里云技术支持或者提交工单,可以获取更多帮助。

    2023-05-16 20:18:53
    赞同 展开评论 打赏
  • 出现load ddl错误可能有以下几种原因:

    1. oss中输入的路径或bucket名称错误,导致无法访问到数据。
    2. 数据格式不匹配,导致无法正确解析数据。
    3. oss权限不足,无法加载数据源。

    解决方法:

    1. 检查oss中输入的路径或bucket名称是否正确。可以在oss控制台上查看并确认路径和bucket的正确性。
    2. 检查数据格式是否匹配,可以尝试手动加载数据并检查数据格式是否正确。
    3. 检查oss权限是否足够,在oss控制台上设置权限。如果您不是bucket的拥有者,请联系bucket的拥有者更改权限。
    2023-05-16 18:01:45
    赞同 展开评论 打赏
  • 这个错误信息提示MaxCompute在执行DDL操作时发生了内部错误,具体错误原因可能是DDL操作的内部状态不确定,无法加载编辑日志中的DDL状态信息。

    针对这个问题,可以尝试以下解决方案:

    1、检查MaxCompute和OSS的网络连接是否正常,确保网络畅通。

    2、如果之前进行了DDL操作,可以尝试使用undo修改或删除该操作,然后重新执行DDL操作。

    3、如果以上方法都无法解决问题,可以尝试联系阿里云技术支持,以获取更详细的帮助。

    以下是创建OSS外部表的示例代码,供参考:

    CREATE EXTERNAL TABLE oss_table (
      col1 string,
      col2 bigint,
      col3 double
    )
    STORED BY 'com.aliyun.odps.OssStorageHandler'
    WITH SERDEPROPERTIES (
      'oss.endpoint'='<your_oss_endpoint>',
      'oss.accessKeyId'='<your_access_key_id>',
      'oss.accessKeySecret'='<your_access_key_secret>',
      'oss.bucket'='<your_bucket_name>',
      'oss.path'='<your_table_path>',
      'serialization.format'='1'
    );
    
    2023-05-16 16:46:37
    赞同 展开评论 打赏
  • 月移花影,暗香浮动

    创建MaxCompute的OSS外部表时,需要注意以下几个方面:

    1. 在创建外部表时,使用的 Endpoint 应该与数据所在的 Endpoint 一致。

    2. OSS 外部表的表名、列名、类型等设置要与原始数据一致。

    3. 创建外部表的同时,需要指定分隔符、字段数量(ROW FORMAT)。

    4. 源数据的路径也要指定正确,否则在查询时会出现 Load DDL 错误。

    根据您的描述,如果在执行查询时出现 Load DDL 错误,则可能是因为在创建外部表时,指定的路径不正确,可以根据下面的方法进行排查:

    1. 确认数据所在的 OSS 路径:登录到 OSS 控制台,找到数据对应的 Bucket 和 Object,记录 Object 的完整路径。

    2. 在创建外部表时,指定正确的路径,形如:

    CREATE EXTERNAL TABLE my_tb (
    col1 STRING,
    col2 INT,
    col3 BIGINT
    )
    STORED BY 'com.aliyun.odps.OssStorageHandler'
    LOCATION 'oss://mybucket/data';
    
    1. 确认权限:在创建外部表时,需要确保当前用户对指定的 OSS 数据路径有读取权限。
    2023-05-16 14:58:08
    赞同 展开评论 打赏
  • 十分耕耘,一定会有一分收获!

    楼主你好,MaxCompute创建OSS外部表时,需要根据OSS存储类型的不同来选择正确的OSS endpoint。如果您使用的是归档存储和冷归档存储,需要在endpoint中添加archive或coldarchive标识,以便于MaxCompute正确地访问OSS。

    同时,当load数据时遇到DDL错误时,可以首先检查您的OSS路径是否正确,并确保您有足够的权限读取该路径下的数据。如果仍然无法解决该问题,您可以尝试重新定义您的表结构,确保它与实际数据的结构相匹配,并检查您load数据的方式是否正确。

    此外,建议您查看MaxCompute的日志文件,以获取更多关于load DDL错误的详细信息,以帮助您进一步排除故障。

    2023-05-16 09:53:57
    赞同 展开评论 打赏
  • 热爱开发

    如果在使用MaxCompute创建OSS外部表时,出现load DDL错误且数据无法查询的情况,可能是由于以下原因引起的:

    OSS存储空间和MaxCompute项目不在同一个region 如果您的OSS存储空间和MaxCompute项目不在同一个region,则需要在创建外部表时指定对应的region。您可以在CREATE EXTERNAL TABLE语句中添加LOCATION参数,指定OSS存储空间的地址及region。

    没有给MaxCompute项目授权访问OSS存储空间的权限 MaxCompute需要访问OSS存储空间来读取外部表数据,因此需要先为MaxCompute项目授权访问OSS存储空间的权限。您可以通过 RAM 或者 ACL 的方式进行授权。

    使用的accessKeyId和accessKeySecret错误 创建外部表时,需提供正确的accessKeyId和accessKeySecret才能访问OSS存储空间中的数据。请确保accessKeyId和accessKeySecret正确无误。

    文件格式不符合要求 在CREATE EXTERNAL TABLE语句中需要指定文件所在路径及文件格式,并且格式需与实际存储的文件格式一致。如果文件格式不是MaxCompute支持的格式,则会导致load DDL失败。

    如果以上方法都无效,请尝试使用odpscmd命令行工具或DataWorks等平台运行您的SQL脚本,同时查看错误日志以获取更多信息,根据错误日志中的提示进行相应的调整。

    2023-05-15 17:17:43
    赞同 展开评论 打赏
  • 从您提供的截图看,错误提示为“Parse Json failed”,可能是由于外部表的 ddl 语句有误导致的。请您按照以下步骤排查问题:

    1. 检查外部表的 ddl 语句是否正确,包括 oss 的 endpoint、bucket、access_id、access_key、path 等信息是否正确。建议您使用 MaxCompute 控制台的“创建表”功能来创建外部表,因为这样会自动填充正确的 ddl 语句。

    2. 检查数据存储位置是否正确,您可以通过 OSS 控制台来查看相关的文件或目录是否存在。

    3. 如果仍然无法解决问题,请联系阿里云技术支持,提供更详细的错误信息和相关日志,以便排查问题。

    至于您提到的“oss 为归档存储和冷归档存储,数据可以写入,查询的时候就显示 load ddl 错误”的问题,可能与 oss 的存储类型无关。无论 oss 存储类型为归档存储或普通存储,外部表 ddl 语句正确的话,应该都能够正常查询数据。

    2023-05-15 17:00:19
    赞同 展开评论 打赏
滑动查看更多
问答排行榜
最热
最新

相关电子书

更多
OSS运维进阶实战手册 立即下载
《OSS运维基础实战手册》 立即下载
OSS运维基础实战手册 立即下载