如何在不转换为 spark 中的数据集的情况下遍历数据框?
How to iterate through dataframe without converting to dataset in spark?
我有一个要迭代的数据框,但我不想将数据框转换为数据集。
我们必须将 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
的成员
您不能像上面代码中给出的那样循环数据帧。使用数据框的 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.
如果您有任何问题,请告诉我。
我有一个要迭代的数据框,但我不想将数据框转换为数据集。 我们必须将 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
的成员您不能像上面代码中给出的那样循环数据帧。使用数据框的 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.
如果您有任何问题,请告诉我。