如何迭代数据帧而不转换为spark中的数据集?

问题描述 投票:-2回答:1

我有一个数据帧,我想通过它迭代,但我不想将数据帧转换为数据集。我们必须将spark scala代码转换为pyspark,而pyspark不支持数据集。

我通过转换为数据集尝试了以下代码

data in file:

abc,a
mno,b
pqr,a
xyz,b

val a = sc.textFile("<path>")

//creating dataframe with column AA,BB

val b = a.map(x => x.split(",")).map(x =>(x(0).toString,x(1).toString)).toDF("AA","BB") 

b.registerTempTable("test")

case class T(AA:String, BB: String)

//creating dataset from dataframe

val d = b.as[T].collect       

d.foreach{ x=>
    var m = spark.sql(s"select * from test where BB = '${x.BB}'")
    m.show()
}

Without converting to dataset it gives error i.e. with

val d = b.collect

d.foreach{ x=>
    var m = spark.sql(s"select * from test where BB = '${x.BB}'")
    m.show()
}

它给出错误:错误:值BB不是org.apache.spark.sql.ROW的成员

apache-spark pyspark apache-spark-sql apache-spark-dataset
1个回答
0
投票

您无法像上面的代码中那样循环数据帧。使用数据帧的rdd.collect循环数据帧。

import spark.implicits._
val df = Seq(("abc","a"), ("mno","b"), ("pqr","a"),("xyz","b")).toDF("AA", "BB")
df.registerTempTable("test")
df.rdd.collect.foreach(x => {
     val BBvalue = x.mkString(",").split(",")(1)
     var m = spark.sql(s"select * from test where BB = '$BBvalue'")
     m.show()
})

在循环内部,我使用mkString将rdd行转换为字符串,然后用逗号分割列值,并使用列索引来访问该值。例如,在上面的代码中我使用了(1),这意味着,列BB列索引是2。

enter image description here

请让我知道,如果你有任何问题。

© www.soinside.com 2019 - 2024. All rights reserved.