Как создать DF на основе критериев фильтра для всех столбцов в Spark / Scala - PullRequest
0 голосов
/ 21 февраля 2020

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

val myDf = Seq(
("0:16:52:01.0000000", "0:16:59:25.0000000", "2020-02-19", "2020-02-19"),
("0:16:52:01.0000000", "0:16:59:25.0000000", "2020-02-19", "2020-02-19"), 
("0:16:52:01.0000000", "0:16:59:25.0000000", "2020-02-19", "2020-02-19")
).toDF("StartTime", "EndTime","StartDate","EndDate")

// i am trying something like this but it gives me all the columns from the original DF if there is a match. 
// But Wanted a way which will give just "StartTime", "EndTime" in the new DF.
myDf.columns.map(name => myDf.filter(s"$name like '%-%'"))

Спасибо

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Вот слегка оптимизированная версия без изменяемых структур данных:

import org.apache.spark.sql.functions.col
val timeCols = myDf.columns.map(col).filterNot(c => myDf.limit(1).filter(c like "%:%:%:%").isEmpty)
val newDf = myDf.select(timeCols:_*)

Может быть, этого достаточно даже для поиска имен столбцов, содержащих time?

val timeCols = myDf.columns.filter(_.toLowerCase.contains("time")).map(col)
0 голосов
/ 21 февраля 2020

придумайте приведенное ниже решение, и оно работает, как я ожидаю. Надеюсь, что может быть лучшее решение, и ожидайте, что кто-то опубликует оптимизированную версию.

import scala.collection.mutable.ArrayBuffer
var timeCols = ArrayBuffer.empty[String] 
myDf.columns.map(x => if (myDf.filter(s"$x like '%-%'").head(1).isEmpty) timeCols += x)
val newDf = myDf.select(timeCols.head, timeCols.tail: _*)
newDf.show(5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...