Выберите столбцы, имя которых содержит указанную c строку из spark scala DataFrame - PullRequest
2 голосов
/ 23 апреля 2020

У меня есть DataFrame, подобный этому.

Name   City  Name_index   City_index
Ali    lhr     2.0          0.0
abc    swl     0.0          2.0
xyz    khi     1.0          1.0

Я хочу отбросить столбцы, которые не содержат строку, например "index".

Ожидаемый результат должен быть таким:

Name_index   City_index
 2.0           0.0
 0.0           2.0
 1.0           1.0

Я пробовал это.

val cols = newDF.columns
    val regex = """^((?!_indexed).)*$""".r
    val selection = cols.filter(s => regex.findFirstIn(s).isDefined)
    cols.diff(selection)
    val res =newDF.select(selection.head, selection.tail : _*)
    res.show()

Но я получаю это:

Name   City
Ali    lhr
abc    swl
xyz    khi

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

В вашем регулярном выражении есть опечатка, исправленная в коде ниже

import org.apache.spark.sql.SparkSession

object FilterColumn {

  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder().master("local[*]").getOrCreate()
    import spark.implicits._
    val newDF = List(PersonCity("Ali","lhr",2.0,0.0)).toDF()
    newDF.show()
    val cols = newDF.columns
    val regex = """^((?!_index).)*$""".r
    val selection = cols.filter(s => regex.findFirstIn(s).isDefined)
    val finalCols = cols.diff(selection)
    val res =newDF.select(finalCols.head,finalCols.tail: _*)
    res.show()
  }

}

case class PersonCity(Name : String,   City :String, Name_index : Double,   City_index: Double)
0 голосов
/ 23 апреля 2020
import org.apache.spark.sql.functions.col

val regex = """^((?!_indexed).)*$""".r
val schema = StructType(
      Seq(StructField("Name", StringType, false),
          StructField("City", StringType, false),
          StructField("Name_indexed", IntegerType, false),
          StructField("City_indexed", LongType, false)))

val empty: DataFrame = spark.createDataFrame(spark.sparkContext.emptyRDD[Row], schema = schema)
val columns = schema.map(_.name).filter(el => regex.pattern.matcher(el).matches())
empty.select(columns.map(col):_*).show()

Даёт

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