S02002

错误代码

S02002

报错信息

Failed to parse the metacode of SQL statement into distributed queries. RefId:S02002

错误原因

saveText 函数的第一个参数是 SQL 元代码,该元代码涉及分布式表的查询,在执行时会检查对应的 SQL 语句能否拆分成多个子查询。出现以下几种情况时,会被认为不可被拆分并报错:

  1. 子查询结束后,仍需要执行一次统一查询。例如,选取 top 100 的查询在各个分区执行后,仍需要统一查询一次。
    SELECT EventTime FROM pt ORDER BY EventTime LIMIE 10; 
  2. 查询结果和数据的顺序相关。例如,查询中包含deltas(差值运算)。
    SELECT deltas(x) FROM pt;
  3. 查询需要整个表的数据涉及多张不同类型的表。例如,进行 left join 查询时,左表是内存表,右表是分区表。
    SELECT SUM(x) FROM t1 LEFT JOIN pt2 ON t1.id = pt2.id 
  4. 查询中包含 pivot by。
    SELECT x FROM PIVOTE BY timestamp, sym;

解决办法

当函数的第一个参数是 SQL 元代码时,按照上文提到的原因分析,检查元代码中的 SQL 语句是否可被拆分为多个子查询。若不能,考虑使用 SQL 语句查询替换 SQL 元代码。

参考以下场景:

n = 10000
type = take(1..10, n)
t = table(type)
dbName = "dfs://test_db";
db = database(dbName, HASH, [INT, 2])
pt = db.createPartitionedTable(t, `pt, `type)
pt.append!(t)

saveText(<select top 100 * from pt>, "res.txt") // throw exception
saveText(select top 100 * from pt, "res.txt") // OK