Apache spark Spark sql如何在循环中为输入数据帧中的每个记录执行sql命令

Apache spark Spark sql如何在循环中为输入数据帧中的每个记录执行sql命令,apache-spark,dataframe,Apache Spark,Dataframe,Spark sql如何在循环中为输入数据帧中的每个记录执行sql命令 我有一个具有以下模式的数据框架 %> input.printSchema root |-- _c0: string (nullable = true) |-- id: string (nullable = true) 我需要在另一个数据帧上执行sql命令 val testtable = testDf.registerTempTable("myta

Spark sql如何在循环中为输入数据帧中的每个记录执行sql命令

我有一个具有以下模式的数据框架

     %> input.printSchema
        root
        |-- _c0: string (nullable = true)
        |-- id: string (nullable = true)
我需要在另一个数据帧上执行sql命令

        val testtable = testDf.registerTempTable("mytable")

        %>testDf.printSchema
            root
            |-- _1: integer (nullable = true)

        sqlContext.sql(s"SELECT * from mytable WHERE _1=$id").show()

$id应来自输入数据框,并且sql命令应针对所有输入表id执行。假设您可以使用一个新的数据框,该数据框包含
testDf
中存在的所有行,并且与
input
id
列中存在的值相匹配,则可以执行内部联接操作,如阿尔贝托所述:

val result = input.join(testDf, input("id") == testDf("_1"))
result.show()
现在,如果您希望在
testDf
中为每个不同的值提供一个新的、不同的数据帧,那么问题就更难了。如果是这种情况,我建议您确保查找表中的数据可以作为本地列表收集,这样您就可以循环遍历其值并为每个值创建一个新的数据框,正如您所想的那样(不建议使用此):


无论如何,除非查找表非常小,否则我建议您调整您的逻辑以使用我的第一个示例中的单个连接数据帧。

您可能希望使用不同的键在两个表之间执行
内部连接
。没错,我希望testDf中的每个不同值都有新的不同数据帧。因为我必须与参考数据帧进行连接以获得最终输出。
val localArray: Array[Int] = input.map { case Row(_, id: Integer) => id }.collect
val result: Array[DataFrame] = localArray.map {
  i => testDf.where(testDf("_1") === i)
}