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-операции в любом путь.