我是scala编程的新手。我有一个用例,可以根据数据框中的另一个列值将列值检索到变量中
这是在scala上。
我有以下数据框
我需要将位置列的值添加到基于传入的 name 列的变量中。 也就是说,如果传入的名称是``xxx'',则需要将值``印度''输入到数据框中的变量中。
答案 0 :(得分:1)
如果我真的了解您的意思,那只是一个过滤器,然后选择相应的location值。 以下代码是一个示例
import org.apache.spark.sql.catalyst.encoders.RowEncoder
import org.apache.spark.sql.{Row, SparkSession}
import org.apache.spark.sql.types.DataTypes._
import org.apache.spark.sql.types.{StructField, StructType}
import org.apache.spark.sql.functions.col
import org.scalatest.FunSuite
class FilterTest extends FunSuite {
test("filter test") {
val spark = SparkSession.builder()
.master("local")
.appName("filter test")
.getOrCreate()
val schema = StructType(
Seq(
StructField("name", StringType, true),
StructField("age", IntegerType, true),
StructField("location", StringType, true)
)
)
val data = Seq(
Row("XXX", 34, "India"),
Row("YYY", 42, "China"),
Row("ZZZ", 36, "America")
)
val dataset = spark.createDataset(data)(RowEncoder(schema))
val value = dataset.filter(col("name") === "XXX").first().getAs[String]("location")
assert(value == "India")
}
}
答案 1 :(得分:0)
假设,所传递的值对于数据框而言是唯一的,否则将返回多行,并且您必须以其他方式进行处理。这是解决问题的方法:
scala> import spark.implicits._
import spark.implicits._
scala> val df = Seq(("XXX",34, "India"), ("YYY", 42, "China"), ("ZZZ", 36, "America")).toDF("name", "age", "location")
scala> df.show()
+----+---+--------+
|name|age|location|
+----+---+--------+
| XXX| 34| India|
| YYY| 42| China|
| ZZZ| 36| America|
+----+---+--------+
scala> val input = "XXX"
input: String = XXX
scala> val location = df.filter(s"name = '$input'").select("location").collect()(0).getString(0)
location: String = India
希望这能解决您的要求。...
答案 2 :(得分:0)
您可以使用过滤器获取列名称值为xxx的行。一旦有了行,就可以显示该行的任何列。
var filteredRows = dataFrame.filter(row => {
row.get(0).equals("XXX")
})
filteredRows.rdd.first().get(2)