创建一个寄存器动态数据帧作为spark中的temptable

时间:2017-04-13 18:29:37

标签: apache-spark apache-spark-sql spark-dataframe

我正在尝试从动态数据帧中注册TEMtables。

我将输出作为字符串。我不确定是否有办法执行数据帧或将字符串转换为数据帧,以便可以创建临时表。

以下是复制此问题的步骤:

import org.apache.spark.sql._

val contact_df = sc.makeRDD(1 to 5).map(i => (i, i * i)).toDF("value", "square")
val acct_df = sc.makeRDD(1 to 5).map(i => (i, i / i)).toDF("value", "devide")

val dataframeJoins = Array( 
  Row("x","","",""  ,"Y","",1,"contact_hotline_df","contact_df","acct_nbr","hotline_df","tm49_acct_nbr"),
  Row("x","","","","Y","",2,"contact_hotline_acct_df","acct_df","tm06_acct_nbr"  ,"contact_hotline_df","acct_nbr")
)

val dfJoinbroadcast = sc.broadcast(dataframeJoins)

val DFJoins1 = for ( row <- dfJoinbroadcast.value ) yield {  
  (row(8)+".registerTempTable(\""+row(8)+"\")" )
}

for (rows <- 0 until DFJoins1.size ){
  println(DFJoins1(rows) )
  DFJoins1(rows)
}

以上是for循环的输出:

contact_df.registerTempTable("contact_df")
acct_df.registerTempTable("acct_df")

我没有收到任何错误。但是表格没有被创建。

当我说sqlContext.sql(“select * from contact_df”)时,我收到的错误是没有创建表。

有没有办法将字符串转换为数据帧并执行数据帧以创建temptable。

请建议。

谢谢, Sreehari

1 个答案:

答案 0 :(得分:0)

你的代码连接字符串并打印结果,就是这样。未调用registerTempTable方法,这就是您无法在SQL查询中使用它的原因。尝试这样做:

// assuming we have this string to object mapping
val tableNameToDf = Map("contact_df" -> contact_df, "acct_df" -> acct_df)

您可以将for循环重构为:

val dfJoins = for (row <- dfJoinbroadcast.value) yield {
   val wannabeTable = row(8)
   tableNameToRdd(wannabeTable).createOrReplaceTempView(wannabeTable)
   wannabeTableName
}