我正在尝试从动态数据帧中注册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
答案 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
}