2016-08-31 2 views
4

registerTempTablecreateOrReplaceTempViewスパーク2. +)のテーブルがキャッシュされていますか?spark-sqlを使用した一時テーブルキャッシュ

Zeppelinを使用して、重い計算の後にDataFrameを私のスカラーコードに登録し、次に%pysparkにアクセスし、それをさらにフィルタリングしたいと思います。

メモリキャッシュ版を使用しますか?それとも毎回再建されるのだろうか?

答えて

12

登録されたテーブルはキャッシュされません。

registerTempTable createOrReplaceTempView方法は、単に与えられたクエリプランで指定したDataFrameのビューを作成したり、置き換えられます。

永続的なビューを作成する必要がある場合は、クエリプランを正規化されたSQL文字列に変換し、メタストアにビューテキストとして格納します。

DataFrameを明示的にキャッシュする必要があります。例えば:

df.createOrReplaceTempView("my_table") # df.registerTempTable("my_table") for spark <2.+ 
spark.cacheTable("my_table") 

EDIT:

のは一例でこれを説明してみましょう:

cacheTable使用:今すぐ cache.registerTempTableを使用して同じ例

scala> val df = Seq(("1",2),("b",3)).toDF 
// df: org.apache.spark.sql.DataFrame = [_1: string, _2: int] 

scala> sc.getPersistentRDDs 
// res0: scala.collection.Map[Int,org.apache.spark.rdd.RDD[_]] = Map() 

scala> df.createOrReplaceTempView("my_table") 

scala> sc.getPersistentRDDs 
// res2: scala.collection.Map[Int,org.apache.spark.rdd.RDD[_]] = Map() 

scala> spark.cacheTable("my_table") 

scala> sc.getPersistentRDDs 
// res4: scala.collection.Map[Int,org.apache.spark.rdd.RDD[_]] = Map(2 -> In-memory table my_table MapPartitionsRDD[2] at cacheTable at <console>:26) 

cache.createOrReplaceTempView

scala> sc.getPersistentRDDs 
// res2: scala.collection.Map[Int,org.apache.spark.rdd.RDD[_]] = Map() 

scala> val df = Seq(("1",2),("b",3)).toDF 
// df: org.apache.spark.sql.DataFrame = [_1: string, _2: int] 

scala> df.createOrReplaceTempView("my_table") 

scala> sc.getPersistentRDDs 
// res4: scala.collection.Map[Int,org.apache.spark.rdd.RDD[_]] = Map() 

scala> df.cache.registerTempTable("my_table") 

scala> sc.getPersistentRDDs 
// res6: scala.collection.Map[Int,org.apache.spark.rdd.RDD[_]] = 
// Map(2 -> ConvertToUnsafe 
// +- LocalTableScan [_1#0,_2#1], [[1,2],[b,3]] 
// MapPartitionsRDD[2] at cache at <console>:28) 
+0

のでdf.cache.registerTempTableは実際には役に立たないのですか? –

3

これはありません。明示的にキャッシュする必要があります。

sqlContext.cacheTable("someTable") 
関連する問題