2015-01-19 32 views
8

Bir önbellek sql sorgu sonucunu rdd.cache() kullanmadan önbelleğe almanın bir yolu var mı? Örnekler için :Spark SQL: rdd.cache kullanmadan sql sorgu sonucunu önbelleğe alma()

output = sqlContext.sql("SELECT * From people") 

Biz output.cache kullanabilirsiniz() sonucunu önbelleğe, ama sonra başa sql sorgusu kullanamazsınız.

Yani sormak istediğim sonuç önbelleğe almak için sqlcontext.cacheTable() gibi bir şey var mı?

cevap

18

Önbelleğe almak için sqlContext.cacheTable("table_name") kullanmalı veya alternatif olarak CACHE TABLE table_name SQL sorgusunu kullanmalısınız.

İşte bir örnek. ,

sqlContext.sql('select * from people').collect() 

olarak devam için: Biz bir tablo var ve onu sorgulayabilir Şimdi

people = sc.textFile('hdfs://sparkdemo:8020/people.txt') 
people_t = people.map(lambda x: x.split('|')).map(lambda x: Row(id=x[0], name=x[1], email=x[2])) 
tbl = sqlContext.inferSchema(people_t) 
tbl.registerTempTable('people') 

:

1|Alex|[email protected] 
2|Paul|[email protected] 
3|John|[email protected] 

Sonra PySpark kod: Ben HDF'ler bu dosyayı var 3 seçeneğimiz var:

# 1st - using SQL 
sqlContext.sql('CACHE TABLE people').collect() 
# 2nd - using SQLContext 
sqlContext.cacheTable('people') 
sqlContext.sql('select count(*) from people').collect()  
# 3rd - using Spark cache underlying RDD 
tbl.cache() 
sqlContext.sql('select count(*) from people').collect()  

1. ve 2. seçenekler a 3. sıra yönlendirilmiş şekilde tıpkı diğer RDD olarak önbelleğe olacağını ise onlar, optimize bellek sütunlu bir formatta veri önbelleğe gibi tercih yeniden

Yani sorunuza geri gidiş, burada olası bir çözüm:

output = sqlContext.sql("SELECT * From people") 
output.registerTempTable('people2') 
sqlContext.cacheTable('people2') 
sqlContext.sql("SELECT count(*) From people2").collect() 
+0

"Spark SQL, memory.catalog.cacheTable (" tableName ") veya dataFrame.cache() yöntemini çağırarak bellek içi sütun biçimini kullanarak tabloları önbelleğe alabilir." (https://spark.apache.org/docs/latest/sql-programming-guide.html#caching-data-in-memory). Belgeler, 1., 2. ve 3. seçeneklerin hepsinin eşdeğer olduğunu ima ediyor gibi görünüyor. – asmaier

3

aşağıdaki RDDs ve yararlı Zeppelin veya

CACHE TABLE CACHED_TABLE AS 
SELECT $interesting_query 
sonra

sen önbelleğe yanı sıra tüm sorgulara interesting_query müteakip kullanımlar için hem okur benzer SQL ağır ortamlar için .cache kullanmak gibi en çoküzerinde.

Bu cevap kabul edilen yanıt dışına göre ancak AS kullanmanın güç gerçekten herhangi bir şekilde RDD/Dataframe-operasyonlarını yapamaz .collect() ya edebilir daha kısıtlı bir SQL okunur ortamlarda, çağrı yararlı yapılan budur edilir .