【云计算】阿里云爬坑记录-ORDER BY must be used with a LIMIT clause

00.背景

在使用Tableau连接MaxCompute的时候,经常会出现这样的报错,现在记录一下我的处理流程

 

01.发现问题

打算用tableau分析一下site_name这个字段的分布情况,首先想把site_name里面的字段分好类别

【云计算】阿里云爬坑记录-ORDER BY must be used with a LIMIT clause_第1张图片

 结果就是:报错... 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 must be used with a LIMIT clause_第2张图片 

 

 02.寻找解决方案的第一步--自己尝试

我看了一下是ORDER BY..行吧,此时我做的图正在按件数排序,那我把排序清除再进行分组行不行

【云计算】阿里云爬坑记录-ORDER BY must be used with a LIMIT clause_第3张图片

 但还是继续上面那个报错.....

 

03.寻找解决方案的第二步--网上搜索

没辙,那我上网搜搜别人是怎么做的吧...

于是我找到了一个前辈的做法:

出错原因:没有加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里....

 

04.寻找解决方案的第三步--阿里官网

民间似乎没有满意的答案,那我去找找官方文档吧,看看 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

04.寻找解决方案的第四步--Tableau官网

终于找到解决方案啦!!!!!撒花!!!!!!! 

在Alibaba MaxCompute的连接器选项中,第3步骤(可选)中有介绍说“初始SQL”,这个功能可以在每次连接时运行!!(之前说的把limit刻在Tableau查询的DNA里....还真能刻)

Alibaba MaxCompute - Tableau 

进行连接并设置数据源

  1. 启动 Tableau,并在“连接”下选择“Alibaba MaxCompute”。有关数据连接的完整列表,请在“至服务器”下选择“更多”。然后执行以下操作:

    1. 输入“服务器”的 URL。
    2. 输入“用户名”和“密码”。
    3. (可选)选择“初始 SQL”以指定要在每次连接开始时(例如打开工作簿、刷新数据提取、登录到 Tableau Server 或发布到 Tableau Server 时)运行的 SQL 命令。有关详细信息,请参见运行初始 SQL。
    4. 选择“登录”

 

05. 操作方法

在连接数据源这里,小箭头下拉选项有个“初始SQL”

【云计算】阿里云爬坑记录-ORDER BY must be used with a LIMIT clause_第4张图片 

把limit的开关语句放进去,这里可以设置应用的程序(但是太高阶了,不实用,普通用户选择TableauAPP就好,TableauAPP适用场景:Tableau Desktop和Tableau Server)

 【云计算】阿里云爬坑记录-ORDER BY must be used with a LIMIT clause_第5张图片

运行初始 SQL - Taleau 

 

06.Tableau Server生效的补充(可选)

因为到时候是需要发布在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 命令。

 

 

你可能感兴趣的:(云计算,云计算,阿里云)