本文为您介绍在MaxCompute中执行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作业信息,请参见计算优化最佳实践。