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 被主流采用的兩個主要因素: