Ignite实战( 八 )


4.本地执行要强制本地执行查询,请使用SqlFieldsQuery.setLocal(true). 在这种情况下,查询是针对存储在运行查询的节点上的数据执行的 。这意味着查询的结果几乎总是不完整的 。仅当您确信自己了解此限制时才使用本地模式 。
5.WHERE子句中的子查询SELECT在INSERTandMERGE语句中使用的查询以及SELECT由UPDATEandDELETE操作生成的查询以colocated 或 non-colocated 分布式模式分布和执行 。
但是,如果有一个子查询作为WHERE子句的一部分执行,则它只能在 colocated 模式下执行 。
例如 , 让我们考虑以下查询:
DELETE FROM Person WHERE id IN(SELECT personId FROM Salary s WHERE s.amount > 2000);SQL 引擎生成SELECT查询以获取要删除的条目列表 。该查询在整个集群中分布和执行,如下所示:
SELECT _key, _val FROM Person WHERE id IN(SELECT personId FROM Salary s WHERE s.amount > 2000);但是,IN子句 ( SELECT personId FROM Salary …?) 中的子查询不会进一步分布 , 而是在节点上可用的本地数据集上执行 。
6.插入、更新、删除和合并SqlFieldsQuery您可以执行其他 DML 命令以修改数据:
// 插入IgniteCache<Long, Person> cache = ignite.cache("personCache");cache.query(new SqlFieldsQuery("INSERT INTO Person(id, firstName, lastName) VALUES(?, ?, ?)").setArgs(1L, "John", "Smith")).getAll();// 更新IgniteCache<Long, Person> cache = ignite.cache("personCache");cache.query(new SqlFieldsQuery("UPDATE Person set lastName = ? " + "WHERE id >= ?").setArgs("Jones", 2L)).getAll();// 删除IgniteCache<Long, Person> cache = ignite.cache("personCache");cache.query(new SqlFieldsQuery("DELETE FROM Person " + "WHERE id >= ?").setArgs(2L)).getAll();// 合并IgniteCache<Long, Person> cache = ignite.cache("personCache");cache.query(new SqlFieldsQuery("MERGE INTO Person(id, firstName, lastName)"+ " values (1, 'John', 'Smith'), (5, 'Mary', 'Jones')")).getAll();用于SqlFieldsQuery执行 DDL 语句时 , 必须调用getAll()从query(…?)方法返回的游标 。
7.指定架构默认情况下,执行的任何 SELECT 语句SqlFieldsQuery都将针对 PUBLIC 模式进行解析 。但是,如果您要查询的表在不同的架构中 , 您可以通过调用来指定架构SqlFieldsQuery.setSchema(…?) 。在这种情况下,语句在给定的模式中执行 。
SqlFieldsQuery sql = new SqlFieldsQuery("select name from City").setSchema("PERSON");或者,您可以在语句中定义架构:
SqlFieldsQuery sql = new SqlFieldsQuery("select name from Person.City");8.创建表您可以将任何受支持的 DDL 语句传递到SqlFieldsQuery缓存并在缓存上执行,如下所示 。
IgniteCache<Long, Person> cache = ignite.getOrCreateCache(new CacheConfiguration<Long, Person>().setName("Person"));// Creating City table.cache.query(new SqlFieldsQuery("CREATE TABLE City (id int primary key, name varchar, region varchar)")).getAll();在 SQL 模式方面,执行代码会创建以下表:

  • “Person”模式中的表“Person”(如果之前没有创建过) 。
  • “人员”模式中的表“城市” 。
要查询“City”表,请使用select * from Person.Cityor之类new SqlFieldsQuery("select * from City").setSchema("PERSON")的语句(注意大写) 。
9.取消查询有两种方法可以取消长时间运行的查询 。
第一种方法是通过设置查询执行超时来防止查询失控 。
SqlFieldsQuery query = new SqlFieldsQuery("SELECT * from Person");// Setting query execution timeoutquery.setTimeout(10_000, TimeUnit.SECONDS);第二种方法是通过使用来停止查询QueryCursor.close() 。
SqlFieldsQuery query = new SqlFieldsQuery("SELECT * FROM Person");// Executing the queryQueryCursor<List<?>> cursor = cache.query(query);// Halting the query that might be still in progress.cursor.close();2.6.6 机器学习Apache Ignite 机器学习 (ML) 是一组简单、可扩展且高效的工具,无需昂贵的数据传输即可构建预测机器学习模型 。
将机器和深度学习 (DL) 添加到 Apache Ignite 的基本原理非常简单 。今天的数据科学家必须处理阻碍 ML 被主流采用的两个主要因素: