2017-11-14 9 views
1

これはSpark 1.6.xです。私は回避策を探しています。RDDから作成したDataFrameでregisterTempTableが失敗する

私はDataFrameの基底RDDからDataFrameを作成する機能を持っている:

def rddAndBack(sc: SparkContext, df: DataFrame) : DataFrame = { 
    val sqlContext = new org.apache.spark.sql.SQLContext(sc) 
    sqlContext.createDataFrame(df.rdd, df.schema) 
} 

私はカップルのデータフレームを作成して登録します。

val df = sc.parallelize(Array(1, 2, 3)).toDF("foo") 
val df2 = rddAndBack(sc, df) 
df.registerTempTable("df") 
df2.registerTempTable("df2") 

これは動作します:

scala> sqlContext.sql("SELECT * FROM df") 
res23: org.apache.spark.sql.DataFrame = [foo: int] 

しかし、これはありません:

scala> sqlContext.sql("SELECT * FROM df2") 
org.apache.spark.sql.AnalysisException: Table not found: df2; line 1 pos 14 
    at org.apache.spark.sql.catalyst.analysis.package$AnalysisErrorAt.failAnalysis(package.scala:42) 

これは2.xでも問題なく動作しますが、1.6で回避策を見つける必要があります。

答えて

2

これは、関数に新しいSQLContextを作成したためです。テンポラリテーブルはその親コン​​テキストに制限されているため、別のテーブルからはアクセスできません。これを解決する

df2.sqlContext.sql("SELECT * FROM df2") 

SparkContextの代わりにSQLContext既存渡し:

def rddAndBack(sqlContext: org.apache.spark.sql.SQLContext, df: DataFrame) = { 
    sqlContext.createDataFrame(df.rdd, df.schema) 
} 

又はgetOrCreateファクトリメソッド使用:

def rddAndBack(sc: SparkContext, df: DataFrame) : DataFrame = { 
    val sqlContext = org.apache.spark.sql.SQLContext.getOrCreate(sc) 
    sqlContext.createDataFrame(df.rdd, df.schema) 
} 

または入力dfに結合SQLContextインスタンス使用:

def rddAndBack(sc: SparkContext, df: DataFrame) : DataFrame = { 
    val sqlContext = df.sqlContext 
    sqlContext.createDataFrame(df.rdd, df.schema) 
} 
関連する問題