S02002
错误代码
S02002
报错信息
Failed to parse the metacode of SQL statement into distributed queries. RefId:S02002
错误原因
saveText
函数的第一个参数是 SQL 元代码,该元代码涉及分布式表的查询,在执行时会检查对应的 SQL
语句能否拆分成多个子查询。出现以下几种情况时,会被认为不可被拆分并报错:
- 子查询结束后,仍需要执行一次统一查询。例如,选取 top 100
的查询在各个分区执行后,仍需要统一查询一次。
SELECT EventTime FROM pt ORDER BY EventTime LIMIE 10;
- 查询结果和数据的顺序相关。例如,查询中包含deltas(差值运算)。
SELECT deltas(x) FROM pt;
- 查询需要整个表的数据涉及多张不同类型的表。例如,进行 left join
查询时,左表是内存表,右表是分区表。
SELECT SUM(x) FROM t1 LEFT JOIN pt2 ON t1.id = pt2.id
- 查询中包含 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