Как получить значение столбца на основе другого значения столбца в переменной - PullRequest
0 голосов
/ 15 января 2019

Я новичок в программировании Scala. У меня есть сценарий использования для извлечения значения столбца в переменную на основе другого значения столбца в кадре данных

Это на скале.

У меня есть следующий фрейм данных

Data Frame table

Мне нужно получить значение столбца location в переменную на основе переданного столбца name . то есть, если передано имя 'xxx', мне нужно значение 'India' в переменной из фрейма данных.

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Вы можете использовать фильтр, чтобы получить строку, где значение имени столбца равно ххх. Если у вас есть строка, вы можете отобразить любой столбец этой строки.

var filteredRows = dataFrame.filter(row => {
    row.get(0).equals("XXX")
})
filteredRows.rdd.first().get(2)
0 голосов
/ 15 января 2019

Если я действительно понимаю, что вы имеете в виду, это просто фильтр и выберите соответствующее значение местоположения. Следующий код является примером

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")
  }
}

0 голосов
/ 15 января 2019

Предполагается, что переданное значение является уникальным для фрейма данных, в противном случае будет возвращено несколько строк, и вам придется работать другим способом. Вот способ, которым вы можете решить это:

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

Надеюсь, это решит ваше требование ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...