如何根据变量中的另一个列值检索列值

时间:2019-01-15 11:00:02

标签: scala apache-spark

我是scala编程的新手。我有一个用例,可以根据数据框中的另一个列值将列值检索到变量中

这是在scala上。

我有以下数据框

Data Frame table

我需要将位置列的值添加到基于传入的 name 列的变量中。 也就是说,如果传入的名称是``xxx'',则需要将值``印度''输入到数据框中的变量中。

3 个答案:

答案 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)