web-dev-qa-db-fra.com

Récupérer Spark liste de colonnes de trame de données

Comment obtenir tous les noms de colonnes dans un spark dataframe dans une variable Seq.

Données d'entrée et schéma

val dataset1 = Seq(("66", "a", "4"), ("67", "a", "0"), ("70", "b", "4"), ("71", "d", "4")).toDF("KEY1", "KEY2", "ID")

dataset1.printSchema()
root
|-- KEY1: string (nullable = true)
|-- KEY2: string (nullable = true)
|-- ID: string (nullable = true)

J'ai besoin de stocker tous les noms de colonnes dans une variable à l'aide de la programmation scala. J'ai essayé comme ci-dessous, mais cela ne fonctionne pas.

val selectColumns = dataset1.schema.fields.toSeq

selectColumns: Seq[org.Apache.spark.sql.types.StructField] = WrappedArray(StructField(KEY1,StringType,true),StructField(KEY2,StringType,true),StructField(ID,StringType,true))

Production attendue:

val selectColumns = Seq(
  col("KEY1"),
  col("KEY2"),
  col("ID")
)

selectColumns: Seq[org.Apache.spark.sql.Column] = List(KEY1, KEY2, ID)
11
RaAm

Vous pouvez utiliser la commande suivante:

val selectColumns = dataset1.columns.toSeq

scala> val dataset1 = Seq(("66", "a", "4"), ("67", "a", "0"), ("70", "b", "4"), ("71", "d", "4")).toDF("KEY1", "KEY2", "ID")
dataset1: org.Apache.spark.sql.DataFrame = [KEY1: string, KEY2: string ... 1 more field]

scala> val selectColumns = dataset1.columns.toSeq
selectColumns: Seq[String] = WrappedArray(KEY1, KEY2, ID)
14
Yaron
val selectColumns = dataset1.columns.toList.map(col(_))
7
RaAm

J'utilise la propriété des colonnes comme ça

val cols = dataset1.columns.toSeq

puis si vous sélectionnez toutes les colonnes plus tard dans l'ordre de la séquence de la tête à la queue, vous pouvez utiliser

val orderedDF = dataset1.select(cols.head, cols.tail:_ *)
3
uh_big_mike_boi

nous pouvons obtenir les noms de colonnes d'un ensemble de données/table dans une variable de séquence de la manière suivante.

de Dataset,

val col_seq:Seq[String] = dataset.columns.toSeq

de la table,

val col_seq:Seq[String] = spark.table("tablename").columns.toSeq
                           or
val col_seq:Seq[String] = spark.catalog.listColumns("tablename").select('name).collect.map(col=>col.toString).toSeq
1
Krishna Reddy