在使用Tableau连接MaxCompute的时候,经常会出现这样的报错,现在记录一下我的处理流程
打算用tableau分析一下site_name这个字段的分布情况,首先想把site_name里面的字段分好类别
结果就是:报错... failed: ODPS-0130071:[20,1] Semantic analysis exception - ORDER BY must be used with a LIMIT clause, please set odps.sql.validate.orderby.limit=false to use it.
我看了一下是ORDER BY..行吧,此时我做的图正在按件数排序,那我把排序清除再进行分组行不行
但还是继续上面那个报错.....
没辙,那我上网搜搜别人是怎么做的吧...
于是我找到了一个前辈的做法:
出错原因:没有加Limit,添加LIMIT 10000(limit的值根据业务自由设置)后解决问题。
说明:MaxCompute默认
order by
后需要增加limit
限制数量,因为order by
是全量排序,没有limit
时执行性能较低。推荐写法:order by v.shuzi limit 20
查询ODPS数据报ORDER BY must be used with a LIMIT clause, please set odps.sql.validate.orderby.limit=false_DougLeaMrConcurrency的博客-CSDN博客_odps-0130071在使用Java JDBC查询ODPS上的数据时,若使用了Order By,会遇到如下错误:failed: ODPS-0130071:[1,307] Semantic analysis exception - ORDER BY must be used with a LIMIT clause, please set odps.sql.validate.orderby.limit=false to use it.出错原因:没有加Limit,添加LIMIT 10000(limit的值根据业务自由设置)后https://blog.csdn.net/qq_43265673/article/details/113572669好的吧,代码上你是可以加上limit,但是Tableau是每次动态提交SQL啊,我没办法把limit刻在Tableau查询的DNA里....
民间似乎没有满意的答案,那我去找找官方文档吧,看看 please set odps.sql.validate.orderby.limit=false这个推荐方法能在哪里加上去
>>从下面阿里巴巴官方文档中可以看到,分别可以设置Project级别和Session级别的开关,证明好像要解决这个问题,把开关关掉似乎是条唯一的明路
>>但是依旧找不到在Tableau哪里设置
DQL操作常见问题 - 云原生大数据计算服务 MaxCompute - 阿里云
执行MaxCompute SQL过程中,报错ORDER BY must be used with a LIMIT clause,如何解决?
- 问题现象执行MaxCompute SQL过程中,返回报错如下。
FAILED: ODPS-0130071:[1,27] Semantic analysis exception - ORDER BY must be used with a LIMIT clause, please set odps.sql.validate.orderby.limit=false to use it.
- 产生原因
ORDER BY需要对单个执行节点做全局排序,所以默认带LIMIT限制,避免误用导致单点处理大量数据。
- 解决措施如果您的使用场景确实需要ORDER BY放开LIMIT限制,可以通过如下两种方式实现:
- Project级别:设置
setproject odps.sql.validate.orderby.limit=false;
关闭order by
必须带limit
的限制。- Session级别:设置
set odps.sql.validate.orderby.limit=false;
关闭order by
必须带limit
的限制,需要与SQL语句一起提交。说明 如果关闭
order by
必须带limit
的限制,在单个执行节点有大量数据排序的情况下,资源消耗或处理时长等性能表现会受到影响。更多ORDER BY信息,请参见ORDER BY全局排序(order_condition)。
=========================================================================
其他搜索结果(虽然对这个case帮助不大,但是难保以后会用到...)
DQL操作常见问题 - 云原生大数据计算服务 MaxCompute - 阿里云
MaxCompute查询得到的数据是根据什么排序的?
MaxCompute中表的读取是无序的。如果您没有进行自定义设置,查询获取的结果也是无序的。
如果您对数据的顺序有要求,需要对数据进行排序。例如,在SQL中需要加上
order by xx limit n
对数据进行排序。如果您需要对数据进行全排序,只需要将
limit
面的n
设置为数据总条数+1
即可。说明 海量数据的全排序,对性能的影响非常大,而且很容易造成内存溢出问题,请尽量避免执行该操作。
不兼容SQL重写 - 云原生大数据计算服务 MaxCompute - 阿里云
order.by.no.limit
说明:MaxCompute默认
order by
后需要增加limit
限制数量,因为order by
是全量排序,没有limit
时执行性能较低。示例
- 错误写法
select * from (select * from (select cast(login_user_cnt as int) as uv, '3' as shuzi from test_login_cnt where type = 'device' and type_name = 'mobile') v order by v.uv desc) v order by v.shuzi limit 20;
- 报错信息
FAILED: ODPS-0130071:[4,1] Semantic analysis exception - ORDER BY must be used with a LIMIT clause
在子查询
order by v.uv desc
中增加limit
。
终于找到解决方案啦!!!!!撒花!!!!!!!
在Alibaba MaxCompute的连接器选项中,第3步骤(可选)中有介绍说“初始SQL”,这个功能可以在每次连接时运行!!(之前说的把limit刻在Tableau查询的DNA里....还真能刻)
Alibaba MaxCompute - Tableau
进行连接并设置数据源
启动 Tableau,并在“连接”下选择“Alibaba MaxCompute”。有关数据连接的完整列表,请在“至服务器”下选择“更多”。然后执行以下操作:
- 输入“服务器”的 URL。
- 输入“用户名”和“密码”。
- (可选)选择“初始 SQL”以指定要在每次连接开始时(例如打开工作簿、刷新数据提取、登录到 Tableau Server 或发布到 Tableau Server 时)运行的 SQL 命令。有关详细信息,请参见运行初始 SQL。
- 选择“登录”
在连接数据源这里,小箭头下拉选项有个“初始SQL”
把limit的开关语句放进去,这里可以设置应用的程序(但是太高阶了,不实用,普通用户选择TableauAPP就好,TableauAPP适用场景:Tableau Desktop和Tableau Server)
运行初始 SQL - Taleau
因为到时候是需要发布在Tableau Server上供大家查看的,所以需要打开Tableau Server执行初始SQL的开关。(默认是已经打开了,放在这里有备无患)
您的软件许可证可能会限制您针对连接使用初始 SQL。如果发布到 Tableau Server,则必须对该服务器进行配置以允许使用“初始 SQL”语句。默认情况下,已将服务器软件配置为在 Web 浏览器加载工作簿时允许运行这些语句。
管理员可通过使用
tsm configuration set
命令将服务器配置为忽略初始 SQL 语句:
tsm configuration set -k vizqlserver.initialsql.disabled -v true
如果服务器不允许使用初始 SQL 语句,则该工作簿仍会打开,但不会发送初始 SQL 命令。