SQL其他常见问题

本文为您介绍在MaxCompute中执行SQL时,与数据类型、SQL限制等相关的常见问题。

问题类别

常见问题

数据类型

SQL限制

SQL作业运行

SQL作业查看

SQL作业调优

SQL作业运行过慢,如何优化?

MaxCompute的时间类型字段是否可以不带时分秒?

时间类型字段可以使用DATE数据类型。使用该数据类型时,您需要打开MaxCompute 2.0数据类型开关。更多MaxCompute 2.0数据类型信息,请参见2.0数据类型版本

在执行MaxCompute SQL过程中,对DOUBLE类型的数据进行等值比较,为什么结果不符合预期?

由于MaxCompute中DOUBLE类型的数值存在一定的精度差,因此不建议直接使用等号(=)对两个DOUBLE类型的数据进行比较。

请对两个DOUBLE类型数据相减,然后取绝对值,当绝对值足够小时,判定两个DOUBLE类型的数据数值相等。

如何解决DECIMAL数据类型精度溢出问题?

您可以在Session级别执行set odps.sql.decimal.odps2=true;命令,打开2.0数据类型开关。但您需要注意,MaxCompute支持的DECIMAL类型数据的最大长度为38位,但实际业务处理过程中如果数据存储为最大长度,在数据处理过程中很容易出现数据溢出问题,建议调小数据长度。

新创建的MaxCompute项目不支持数据类型自动隐式转换,如何解决?

关闭MaxCompute 2.0数据类型之后可进行隐式转换。更多数据类型转换信息,请参见数据类型转换

查询数据时,提示XXXtypeisnotenabled incurrentmode,如何解决?

您可以在Session级别执行set odps.sql.decimal.odps2=true;命令,打开2.0数据类型开关。

如何处理单字段大于8 MB的限制?

由于存储机制限制,MaxCompute表中单个字段的最大长度不能超过8 MB。对于超过8 MB的字段,建议您拆分成多个字段。具体的拆分逻辑您可以根据业务特性设计,保证每个字段不超过8 MB即可。

由于复杂结构的超大字段在数据开发和分析中会严重影响计算性能,因此建议根据数据仓库建设规范来设计您的数据架构,避免出现超大字段:

  • 具有复杂结构的原始数据,作为ODS层,最好以压缩的方式归档。

  • 定时(例如每天)对ODS层的增量数据做数据清洗,复杂字段拆分为多个简单字段,然后存储在CDM层的表中,便于统计和分析数据。

在执行MaxCompute SQL过程中,报错partitions exceeds the specified limit,如何解决?

  • 问题现象

    在执行MaxCompute SQL过程中,返回报错如下。

    FAILED: ODPS-0010000:System internal error - OTS filtering exception - Ots read range partitions exceeds the specified limit:10000:  tableName:xxxx , please check hive conf key
  • 产生原因

    MaxCompute单张表支持6万个分区,但是单次查询最多只支持1万个分区。该报错常见原因如下:

    • 原因一:分区未写分区条件。

    • 原因二:使用类似用户ID的字段作为分区字段,导致分区数量过多。

  • 解决措施

    • 原因一的解决措施:如果未写分区条件,补上分区条件即可。

    • 原因二的解决措施:如果分区列不合适,导致分区数量太多,请考虑更改分区列。

如何非交互式运行MaxCompute SQL?

在操作系统中,您可以通过Shell非交互式运行MaxCompute SQL:

  • 使用odps -f filename方式,读取并处理SQL文件。

    如果运行SQL,Filename文件的第一行是SQL表示已经进入SQL模式。命令示例如下。

    SQL
    
      select ... from table_name where xxx;                
  • 如果只运行一个SQL语句,您可以使用MaxCompute SQL中的sqltext方法,命令示例如下。

    ./odpscmd -e "select * from dual;"             

    您可以通过odps -help获得更多的信息。

SQL能将MaxCompute的配置转移到另外一个阿里云账号上吗?

您可以通过Package方法实现。更多Package授权信息,请参见MaxCompute多团队协同数据开发项目管理最佳实践

如何将开发环境的表数据同步至生产环境的表中?

您可以通过MaxCompute客户端执行如下命令。

insert into project.table select * from project_dev.table;

如果没有生产环境中表的读写权限,需要完成账号授权。更多授权信息,请参见MaxCompute权限

如何判断一个字段是否为空?

您可以通过MaxCompute SQL的运算符判断字段是否为空,更多运算符信息,请参见运算符

是否可以通过DataWorks的Shell节点调取MaxCompute SQL?

不可以。Shell节点仅支持标准Shell语法,不支持交互性语法。如果作业较多,您可以使用ODPS SQL节点执行作业。更多ODPS SQL节点信息,请参见开发ODPS SQL任务

如何在SQL中实现循环?

您可以通过DataWorks的do-while节点实现。

如何在SQL中调用赋值节点?

您可以通过DataWorks的for-each节点实现。

如何查看MaxCompute日执行的所有SQL?

您可以执行show p -all -limit <number>;命令查看MaxCompute项目下所有成员历史执行的SQL信息。更多查看实例信息,请参见查看实例信息

如何查看SQL作业消耗的资源量?

您可以通过账单查看SQL作业消耗的资源量。更多查看账单实践信息,请参见MaxCompute账单用量明细分析

如何查看SQL执行费用?

您可以使用cost sql命令预估查询费用。更多命令信息,请参见计量预估

SQL作业运行过慢,如何优化?

SQL作业可以通过Logview进行定位,定位方法请参见Logview诊断实践

更多优化SQL作业信息,请参见计算优化最佳实践