Spark SQL: как кэшировать результат sql-запроса без использования rdd.кэш()

есть ли способ кэшировать результат sql-запроса кэша без использования rdd.кэш()? для примера:

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

можно использовать выход.cache () кэшировать результат, но тогда мы не можем использовать sql-запрос для его обработки.

поэтому я хочу спросить, есть ли что-то вроде sqlcontext.cacheTable () для кэширования результата?

2 ответов


вы должны использовать sqlContext.cacheTable("table_name") для того, чтобы кэшировать его, или, альтернативно, использовать CACHE TABLE table_name SQL-запрос.

вот пример. У меня есть этот файл на HDFS:

1|Alex|alex@gmail.com
2|Paul|paul@example.com
3|John|john@yahoo.com

затем код в PySpark:

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')

теперь у нас есть таблица и мы можем запросить ее:

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

чтобы сохранить его, у нас есть 3 варианта:

# 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-й и 2-й варианты, поскольку они будут кэшировать данные в оптимизированном столбчатом формате в памяти, а 3-й будет кэшировать его так же, как и любой другой RDD в строке ориентированной моды

Итак, возвращаясь к вашему вопросу, вот одно из возможных решений:

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

больше всего нравится использовать .кэш для RDDs и полезен в Zeppelin или аналогичных SQL-тяжелых средах

CACHE TABLE CACHED_TABLE AS
SELECT $interesting_query

затем вы получаете кэшированные чтения как для последующего использования interesting_query, а также по всем запросам на CACHED_TABLE.

этот ответ основан на принятом ответе, но сила использования AS это то, что действительно сделало вызов полезным в более ограниченных средах только SQL, где вы не можете .collect() или выполните RDD / Dataframe-операции в любом путь.