web-dev-qa-db-fra.com

Spark SQL: comment mettre en cache le résultat d'une requête SQL sans utiliser rdd.cache ()

Existe-t-il un moyen de mettre en cache un résultat de requête SQL de cache sans utiliser rdd.cache ()? pour des exemples:

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

Nous pouvons utiliser output.cache () pour mettre en cache le résultat, mais nous ne pouvons pas utiliser la requête sql pour y faire face.

Je veux donc demander s'il existe quelque chose comme sqlcontext.cacheTable () pour mettre en cache le résultat?

13
lwwwzh

Vous devez utiliser sqlContext.cacheTable("table_name") pour le mettre en cache, ou bien utiliser CACHE TABLE table_name Requête SQL.

Voici un exemple. J'ai ce fichier sur HDFS:

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

Ensuite, le code dans 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')

Nous avons maintenant une table et pouvons l'interroger:

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

Pour le persister, nous avons 3 options:

# 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()     

Les 1re et 2e options sont préférées car elles mettraient en cache les données dans un format en colonnes optimisé en mémoire, tandis que la 3e les mettrait en cache comme tout autre RDD de façon orientée ligne

Pour en revenir à votre question, voici une solution possible:

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

Ce qui suit ressemble le plus à l'utilisation de .cache pour les RDD et est utile dans Zeppelin ou dans des environnements SQL lourds similaires

CACHE TABLE CACHED_TABLE AS
SELECT $interesting_query

vous obtenez alors des lectures mises en cache à la fois pour les utilisations ultérieures de interesting_query, ainsi que pour toutes les requêtes sur CACHED_TABLE.

Cette réponse est basée sur la réponse acceptée, mais la puissance d'utiliser AS est ce qui a vraiment rendu l'appel utile dans les environnements SQL plus restreints, où vous ne pouvez pas .collect() ou faire RDD/Dataframe-opérations en aucune façon.

8
Rick Moritz