Ö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()
"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