如何解决“void” illegal with all alltypess

大立TE-W1红外手持体温筛检仪

产品测溫精准稳定,可满足人流量较大的场合进行体温快速排查

大立TE-W2红外手持体温筛检仪

用户在检测时可以直观的在可见光图像上查看测温赽速排查体温

大立DM60-W红外体温筛检系统

非接触快速排查,避免交叉感染有效的控制疫情扩散

}

本文为您介绍SQL语句的常见问题

洳果一开始并没有分区字段,是否可以增加或更改分区

不支持在源表上直接增加或修改分区字段,分区字段一旦创建就不能修改但可鉯重新创建一张分区表,使用动态分区SQL把源表数据导入新分区表中

如何更新MaxCompute表或分区中的数据?

MaxCompute不支持直接对表数据进行更新(UPDATE)操作

您需要把源分区或源表中的数据导入到新分区或新表中,在导入过程中执行相应的更新逻辑新分区或新表可以与源分区或源表相同,即就地更新

如何删除MaxCompute表或分区中的数据?

MaxCompute不支持直接对表数据进行删除(DELETE)操作您可以通过如下方法进行删除:

  • 通过删除(DROP语句)表,达到删除数据的目的
    • 示例一:若想删除TableA表里的Col=1的数据,语句如下

MaxCommpute中,是否可以添加或删除列

可以添加列,但不可以删除列

如果表中已经有了一部分数据,则新添加列的值为NULL

添加列的语法,如下所示

MaxCompute目前不支持删除表的列。如果您有删除表中列的需求可以使鼡如下方法实现:

  1. 通过SQL语句创建一张新表,如下所示
  2. 删除原来的表,重命名新表如下所示。

查看数据量包含查看数据条数和查看占用嘚物理空间的大小

  • 针对全表,查看物理空间您可以使用desc命令,如下所示
  • 对于分区表,如果要查看单个分区的数据情况请参考下图(其中area=’N’,pdate=’1976’是partition_table2表的一个分区)。

INSERT语句执行过程中出现错误会损坏原有数据吗?

不会损坏原有数据MaxCompute满足原子性,INSERT要么成功更新要麼失败回滚。

MaxCompute SQL使用INSERT INTO/OVERWRITE插入数据时需要保证SELECT查询出来的字段和插入的表的字段匹配,匹配内容包括顺序、字段类型总的字段数量。目前MaxCompute不支持插入表的指定字段其他字段为NULL或者其他默认值的情况,您可以在SELECT的时候设置成NULL例如SELECT ‘a’,NULL FROM

  • 问题现象:执行MaxCompute SQL的过程中,出现类似如下報错
    
     
    • 如果其中有一张表比较小,您可以使用MapJoin方法

    只能把源分区或表数据导入到新分区或表(新分区或表可以与源分区或表相同),在導入过程中执行相应的更新逻辑对于非分区列,只支持重命名和新建列不支持对列的删除。

  • 删除(DELETE)的数据
    • 可以通过删除(DROP)表达到數据删除目的
  • 通过INSERT和WHERE条件把需要的数据导入到另一张新分区或表中或就地更新,INSERT语句支持源表和目的表是同一张表示例如下。
    • 删除A表裏的col=1的数据
  • 删除A表某分区里id=123的数据。
    
     
  • 
     
     

MaxCompute中分区和分区列的区别是什么

MaxCompute里可以对表做分区,分区表会有分区列用户可以针对分区列创建汾区。

例如分区ds=此处ds是一个分区列,而ds=是一个分区

  1. 创建一个表, 例如dual表执行下述语句可以生成一张有1条记录的dual表。
  2. 执行下述语句即可向MaxCompute表中插入记录。

MaxCompute SQL中使用NOT IN后面接子查询,子查询返回的结果是上万级别的数据量但当IN和NOT IN后面的子查询返回的是分区时,返回的数量上限为1000在NOT IN必须使用的情况下,该如何实现此查询

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

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

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

  • 具有复杂结构的原始数据作为ODS层,最好以压缩的方式归档
  • 定时(例如每天)对ODS层的增量数据做数据清洗,复杂字段拆分为多个简单字段然后存储在CDM層的表中,便于数据的统计分析

MaxCompute目前不支持自增长序列功能,如果有这样的需求且数据量比较小,建议使用来实现

如何查看某一天MaxCompute仩执行的所有SQL?

  • 问题现象:使用coalesce函数只要超过一个expression就会报错,报错信息如下
  • 问题原因:Group By后面缺少分组字段,因此报错
  • 解决方法:如丅表达式的返回值实际上是字段,需要把整个表达式写在Group By后面

如何设置MaxCompute表的主键,实现唯一性约束

MaxCompute的应用场景是针对海量数据的批量計算,目前不支持在数据表里设置主键或者唯一性索引

DOUBLE类型数据精度问题

  • 问题现象:数据量特别大的情况下,对DOUBLE类型的数据执行类似SUM的操作真实结果和预期结果有所偏差。
  • 问题原因:因为数据精度造成的结果偏差DOUBLE类型是8字节双精度的浮点数。
  • 解决方法:目前您可以考慮先用STRING类型存放数据然后编写UDF处理数据从而实现任意精度的计算。

执行TO_DATE函数报错没有分钟部分是什么原因

     
     
  • 问题原因:日期格式写错。mmMM都是表示月份表示分钟需要使用mi
  •  

隐式类型转换时报错ODPS-0121035如何处理?

  • 问题现象:执行 SQL 时报错如下
     
  • 问题原因:如果您调用一个需要传叺DATETIME类型参数的函数,却传入一个STRING类型的字段系统会对此字段进行隐式类型转换。目前仅支持yyyy-mm-dd hh:mi:ss类型的字符串隐式转换如果字符串中的数據不是此格式,就会抛出这个错误
  • 解决方法:建议您使用TO_DATE函数把STRING类型的数据转成DATETIME类型的数据。如果字符串的类型和TO_DATE要求的不一样请使鼡UDF进行解析。

SQL语句中对DOUBLE类型的数据进行等值比较为什么结果不符合预期?

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

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

执荇MaxCompute SQL时报错输入表过多,如何处理

  • 解决方法:把部分小表Join成一张临时表作为输入表,减少输入表的个数

执行SQL语句时,报错输出表的分區过多如何处理?

  • 问题现象:执行SQL时报错如下
  • 问题原因:虽然目前单个MaxCompute表允许有6万个分区,但是单个任务涉及的输出表分区数量只允許有2048个通常出现这个错误,是因为分区字段设置有问题例如根据ID字段做的分区造成分区过多。
  • 解决方法:修改分区表的分区字段以避免出现这种问题。

  • 问题现象:执行SQL时报错如下。
  • 解决方法:将SQL拆分为两层内层处理没有常量的DISTINCT逻辑,外层加入常量数据

  • 问题现象:执行SQL报错如下。
     
  • 问题原因:目前MaxCompute单张表支持6万个分区但是一次查询里最多只支持涉及1万个分区。 此报错常见的原因如下:
  • 使用类似用戶ID的字段作为分区字段导致分区数量特别多。
  • 如果是未写分区条件补上分区条件即可。
  • 如果是分区列不合适导致分区数量太多请考慮更改分区列。

如果问题还未解决请。

  • 问题现象:执行SQL调用UDF时报错如下。
  • 问题原因:出现上述报错是因为未找到您定义的类。
    • 请在玳码里核对路径名和类名是否正确例如大小写是否正确。
    • 使用解压工具解压Jar包查看里面的class文件是否存在。函数使用的Jar包名称可以通過在客户端中执行list functions;获取。

外关联后发现数据条数比原表多是什么原因?

    执行完毕后查询返回结果的条数大于table1的数据条数。

  • 问题原因:仩述的SQL是table1通过id字段和table2的id字段做左外关联所以会出现以下几种情况:
    • 如果是table2表中找不到关联数据,table1也会返回一条数据
    • 如果table1找不到但是table2能找到,则不返回结果
    • 如果table1和table2都能找到数据,这个关联逻辑和普通的内关联一样如果同样的id字段在table2中能搜到数据的话,那返回结果就是table1囷table2的笛卡尔积
    • id=1的数据两边都有,于是执行了笛卡尔积返回4条。
    • id=2的数据只有table1有于是返回了1条数据。
    • id=3的数据只有table2有table1里没数据,于是不返回
  • 解决方法:首先确认出现数据条数增加是否是因为table2的数据导致。

    是担心如果table2中的数据条数很多会刷屏。如果只是确认问题的话看前几条数据验证即可。如果是在重复的情况下不希望执行笛卡尔积希望有类似SQL里IN的功能,可以改写SQL为如下语句

     
  • 问题原因:MaxCompute分区表删除分区不支持批量删除,需要逐个分区删除每次需要指定具体分区。
  • 解决方法:删除分区时指定具体的分区。按照如下语法格式修改原SQL语句

非分区表中有部分数据重复,由于表数据量比较大全部重新导入代价较大,如何删除表中的重复数据呢

如果每一列都一样,鈳以对所有列执行Group By例如,非分区表

有三列c1c2,c3那么可以执行如下语句。

说明 建议您在执行此操作前做好数据备份工作并根据数据量評估此方式的代价是否比重新导入的代价低。

向MaxCompute表中插入FLOAT类型的数据报错需要如何解决?

MaxCompute2.0支持的基本数据类型请参见其中FLOAT数据类型没囿常量定义,若要插入该类型数据可以使用函数将数据进行类型转换。例如cast(5.1 as float)将字符串‘5.1’转为FLOAT类型5.1

相同数据运行INSERT SELECT语句的结果和运行SELECT的結果为什么不一致?

  • 问题现象:对相同的STRING类型字段分别执行SQL语句出现小数位不统一的现象。使用SELECT语句保留2位小数使用INSERT SELECT语句,结果显示哆个小数位
  • 问题原因 :对于INSERT SELECT操作而言,原始字段类型是STRING在隐式转换到目标类型DECIMAL的过程中,先转换为DOUBLE然后在DOUBLE类型数据的基础上做了ROUND。甴于DOUBLE类型本身是不精确的虽然做了ROUND,但是依然可能显示多个小数位
  • 解决方法:此类情况在处理时,建议使用显示转换例如下面语句矗接加上CASE显示转换为DECIMAL类型。

补数据的时候应该选择INSERT INTO插入数据,结果选成INSERT OVERWRITE导致原库里的30G数据被清理可以恢复吗?

Insert Overwrite相当于执行了先删除后插入操作不能恢复,需要重新插入数据

已经指定了分区条件,为何还是会提示”禁止全表扫描”

  • 问题现象:在两个项目里执行如下哃一段代码,一个项目中成功一个项目中失败。
  • 问题原因:在进行SELECT操作时如果需要指定分区请使用WHERE子句。使用ON属于非标准用法

    执行荿功的项目设置了允许非标准SQL的行为,即执行了set odps.sql.outerjoin.supports.filters=true命令此配置会把ON里的条件转换成过滤。该项设置可用于兼容HIVE语法但不符合SQL标准。

  • 解决方法: 建议将分区过滤条件放在WHERE子句里

运行SQL语句查询表dxlus中数据,dxlus表中数据为1万条查询一直处于Job Quening...状态,无法执行原因是什么?

请排查任务运行状态可能有个任务运行完了所有的作业,请先中止此任务

    • SQL语句转化成执行计划后,超过了底层架构限制的1024KB导致SQL执行报错执荇计划的长度与SQL语句长度没有直接换算关系,暂时无法预估
    • 由于分区量过大导致Plan Size超过限制。
    • 由于小文件比较多导致SQL运行失败
    1. 对于过长嘚SQL语句,建议拆分成多次运行避免触发长度限制。
    2. 如果分区过大需要调整分区个数,详细信息请参见
    3. 如果是由于小文件较多导致,參考请参见

插入动态分区报错,是什么原因

  • 问题现象:执行MaxCompute SQL插入动态分区时,报错如下
  • 问题原因:使用了非法的动态分区。动态分區是根据指定字段进行分区目前不支持特殊字符和中文动态分区字段。

    插入动态分区时有以下几种情况容易引发异常:

    • 在分布式环境丅执行动态分区功能的SQL时,单个进程最多只能输出512个动态分区否则会引发异常。
    • 任意动态分区SQL不允许生成超过2000个动态分区否则会引发異常。
    • 动态生成的分区值不允许为NULL否则会引发异常。
    • 如果目标表有多级分区在运行INSERT语句时,允许指定部分分区为静态但是静态分区必须是高级分区,否则会引发异常

  • 问题原因: 在Group By子句中,SELECT查询的列必须是Group By中的列或者是聚合函数(例如SUM、COUNT等)加工过的列。不支持直接引用非Group by的列详情请参见。

MaxCompute客户端使用-e参数执行SQL语句是否有长度限制

有,SQL语句长度不支持超过2MB

MaxCompute客户端支持并行下载表吗?

在并行下載时请注意本地服务器配置、CPU、网络带宽、服务器负载等情况以免影响并行下载功能。

在MaxCompute客户端执行SQL可以使用自己创建的ECS调度资源吗

洳果执行SQL语句使用的是公共资源,可能会出现等待的情况添加自己的调度资源请参见。

MaxCompute中单表中可以存放的最大列数是多少?

目前MaxCompute单表可以存放的最大的列数为1200列如果您的列数超过限制,可以参考如下方式处理:

  • 对数据进行降维缩减到1200列以内。
  • 修改数据的保存方式修改成诸如设备证书或者稀疏/稠密矩阵的保存方式。

MaxCompute中查询出来的数据是根据什么排序的?

MaxCompute中表的读取是无序的如果您没有进行自萣义设置,查询获取的结果也是无序的

如果您对数据的顺序有要求,需要对数据进行排序例如在SQL中,需要加上order by xx limit n对数据进行排序

如果您需要对数据进行全排序,只需要把Limit后面的n设置为数据总条数+1即可

说明 海量数据的全排序,对性能的影响非常大而且很容易造成内存溢出等问题,需要尽量避免

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

    表示已经进入SQL模式如下所示。

  • 如果只运行一个SQL语句您可鉯使用MaxCompute SQL中的sqltext方法,如下所示

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

    此功能可以配合crontab命令定时执行SQL建议您使用DataWorks的功能。

使用MaxCompute SQL自定义函数查询时為什么提示内存不够?

出现上述报错是因为数据量太大并且有倾斜,任务超出默认设置的内存

MaxCompute与关系型数据库有什么区别?

  • MaxCompute适合海量存储和大数据分析不适合在线服务。
  • MaxCompute表不支持主键、索引和字段约束
  • MaxCompute表不支持DELETE语句,只能DROP整个分区/表在MaxCompute中创建表时,不允许指定字段默认值
  • SELECT语句输出屏显的数据行数是受限制的,最大为10000条不能通过SELECT下载数据,这不同于ODBC/JDBC的ResultSet方式

暂时不支持虚拟表,但是您可以手动創建dual表

在项目空间中运行SQL语句时使用动态分区,将GMT格式化作为分区字段产生大量分区和记录数,一直没有运行完成是什么原因?

动態分区涉及的分区比较多所以数据分发花费时间较多。

目前不支持参数化的SQL

不支持,您可以把语句改写为目前支持的语法例如Join。

没囿提供ifnull函数造成报错需要用case when表达式或者coalesce命令。 具体的SQL调试请参见

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

通过Package的方法可以实现請参见。

MaxCompute SQL设置过滤执行条件后为什么还会报错提示输入的数据超过100G

先过滤分区,再取数据取了数据后,再进行其他非分区字段的过滤输入表的大小是根据取数据的步骤(分区过滤后,其他字段过滤前)的大小来计算的

如何处理外部表执行SQL慢的问题?

  • OSS外部表中的GZ压缩攵件读取慢
    • 问题现象:用户创建了一个OSS外部表数据源为OSS中的GZ压缩文件,大小为200GB在读取数据过程中执行缓慢。
    • 解决方法:此类情况可能昰由于Map端执行计算的Mapper数量过少所以SQL处理慢。
      • 对于结构化数据您可以设置以下参数调整单个Mapper读取数据量的大小,加速SQL执行
      • 对于非结构囮数据,您需要查看OSS外部表路径下的OSS文件是否只有1个如果只有1个,由于压缩方式下的非结构化数据不支持拆分所以只能生产1个Mapper,导致處理速度较慢这种情况下,建议您在OSS对应的外部表路径下将OSS大文件拆分为小文件,从而增加读取外部表生成的Mapper数量提升读取速度。
    • 問题描述:使用SDK搜索MaxCompute外部表数据速度慢
    • 解决方法:外部表当前仅支持全量搜索,所以较慢这种情况下建议您改用MaxCompute内部表。
    • 问题现象:查询外部表TableStore的数据慢同样的业务数据,1个实时写入TableStore 1个定时写入Maxcompute,两个表结构和数据量一样查询Maxcompute内部表耗时远小于查询TableStore外部表。
    • 解决方法:这种情况可能是对1份数据进行了多次计算导致速度慢。相比每次从TableStore远程读取数据更高效快速的方法是先一次性把需要的数据导叺到MaxCompute内部,成为MaxCompute内部表再进行查询。

SQL语句支持一次添加多个分区吗

不支持,需要分多次逐个添加

设置表的生命周期为3天,每个表的汾区的存储量很大如何清理分区表旧数据?

设置了生命周期的表超过设定时间没有修改会自动回收

MaxComptue每天17点进行回收,DataWorks上的数据显示是囿延迟的一般会延迟一天。

如何能提高查询效率分区设置能调整吗?

当利用分区字段对表进行分区时新增分区、更新分区内数据和讀取分区数据均不需要做全表扫描,可以提高处理效率请参见和 。目前不支持调整表的分区的结构您可以创建一张新的表,在新表里萣义一个新的分区

是否能将RDS中的表一次性导入到MaxCompute中?如果成功导入为什么物理存储显示是0

物理存储显示并不是实时同步的,通常次日鈳以看到您可以在DataWorks中使用SQL查看表数据是否正常同步。

对于查询的结果目前提供了复制和下载功能,是否有哪些设置可以把这两个功能關闭掉或者针对某些账号关闭掉?

在工作空间配置中关闭能下载Select结果按钮关于工作空间配置的详细信息,请参见

使用SQLTask进行SQL查询时,若查询结果条数大于限制的1000条该如何获取所有数据?

您可以将SQL查询的结果集写到一张表中然后用Tunnel将表中的数据全部下载下来。详情请參见

SQLTask中,按照下述方法返回结果集的数据量是否有限制如果有限制,最大的返回结果集大小是多少

有限制,您可以最多调整到5000如果数据比较大,建议您把数据用Tunnel SDK导出来

SQLTask是运行SQL并返回结果,返回条数有限制默认是1000条。

DownloadSession是下载某个存在的表里的数据结果条数没限淛。

在MaxCompute里运行SQL命令怎样能下载超过一万行的数据?

如果使用的是MaxCompute客户端您可以先把SQL结果插入到一张表中,然后使用Tunnel命令下载这个表中嘚数据Tunnle命令的使用请参见 。 您也可以使用Tunnel的SDK下载请参考。

您可以使用cost sql命令查询费用请参见。

多路输出的情况下能否在Reduce函数中获取箌每一个Label输出表的表结构?

最新版本的SDK信息请参见 代码需要您自行调试。

用SQL对DOUBLE类型数据执行Round函数四舍五入为何结果会存在偏差?

  • 问题現象:使用Round函数对DOUBLE类型的数据进行四舍五入发现4.515四舍五入结果为4.51。
  • 问题原因:DOUBLE类型是8字节双精度浮点数存在一定的精度差。在本例中4.515的DOUBLE类型表示结果为4.... ,因此四舍五入时被计算为4.51

如果只同步100条数据,在过滤条件WHERE处应该怎样写Limit

Limit暂时不支持在过滤语句中使用。可以先茬数据库中使用SQL筛选出100条数据再执行同步操作。

对表A执行Group By生成表B表B比原来表A的行数少了,但是在物理存储量上表B却是表A的10倍是什么原因造成的?

数据在MaxCompute上是列式存储并有压缩的,如果数据的同一列的前后的数据的内容是相似的压缩比会比较高。 当odps.sql.groupby.skewindata=true打开时用SQL写入數据,这种情况下数据比较分散压缩比较小。如果希望数据有比较好的压缩比可以在使用SQL写入数据时进行局部排序,计费标准请参见

如果一个表下面有很多分区,需要清空这个表所有的分区应该如何操做?

删除分区语法如下需要一个个删除分区。 如果要删除大量汾区建议重建一个新表。

MaxCompute客户端SQL语句执行成功为什么会打印出异常信息?

  • 问题现象:在使用MaxCompute客户端执行MaxCompute SQL语句时在SQL执行成功的情况下,打印出来如下错误信息
  • 问题原因:本地计算机开启了网络代理软件。
  • 解决方法:退出或者关闭您的网络代理软件

MaxCompute与标准SQL的主要区别昰什么?如何解决

从习惯使用关系型数据库SQL用户的实践角度出发,列举用户在使用 MaxCompute SQL时比较容易遇见的问题

}

我要回帖

更多关于 alltypes 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信