Как я могу получить все имена массивов на Dataframe - PullRequest
0 голосов
/ 30 марта 2019

Как я могу получить все имена массивов в Dataframe?

Проблема в том, что я пытаюсь взорвать ВСЕ массивы.

import org.apache.spark.sql.{Column, DataFrame, SparkSession}
import org.apache.spark.sql.functions.col
import org.apache.spark.sql.types.{ArrayType, StructField, StructType}

val providersDF=SIWINSDF.select(explode(col("**providers**")).as("collection")).select(col("collection.*"))
 def flattenSchema(schema: StructType, prefix: String = null) : Array[Column] = {
    schema.fields.flatMap(f => {
      val colName = if (prefix == null) f.name else (prefix + "." + f.name)

      f.dataType match {
        case st: StructType => flattenSchema(st, colName)
        case _ => Array(col(colName).alias(colName))
      }
    })
  }

  val newDF=providersDF.select(flattenSchema(providersDF.schema):_*)
  newDF.toDF(newDF.columns.map(_.replace(".", "_")): _*).printSchema

Чтобы получить все имена массивов, которые я извлекаючтобы сделать:

, чтобы получить имена, которые я делаю.name)

Любая помощь приветствуется.

1 Ответ

1 голос
/ 30 марта 2019

Вот рекурсивный метод, который извлекает все вложенные столбцы ArrayType из DataFrame:

import org.apache.spark.sql.types._

def extractArrayCols(schema: StructType, prefix: String): Seq[String] =
  schema.fields.flatMap {
    case StructField(name, struct: StructType, _, _) => extractArrayCols(struct, prefix + name + ".")
    case StructField(name, ArrayType(_, _), _, _) => Seq(s"$prefix$name")
    case _ => Seq.empty[String]
  }

Тестирование метода:

import org.apache.spark.sql.functions._

case class W(u: Int, v: Seq[String])

val df = Seq(
  (10, Seq(1, 2), W(1, Seq("a", "b"))),
  (20, Seq(3), W(2, Seq("c", "d")))
).toDF("c1", "c2", "c3")

val arrayCols = extractArrayCols(df.schema, "")
// arrayCols: Seq[String] = ArraySeq(c2, c3.v)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...