2017-11-03 7 views
-1

Ich habe eine Liste Liste (0, 1, 2, 3, 4, 5, 6, 7, 10, 8, 13) und ich habe einen Datenrahmen, die Eingabe aus Textdatei mit keine Header. Ich möchte die Spalten, die in meiner Liste erwähnt sind, von diesem Dataframe (inputFile) abrufen. Meine Eingabedateien haben mehr 20-Säule, aber ich möchte nur Spalten in meiner Liste erwähnt holenholen Spalten basierend auf Liste in Funke

val inputFile = spark.read 
    .format("com.databricks.spark.csv") 
    .option("inferSchema", "true") 
    .option("delimiter", "|") 
    .load("C:\\demo.txt") 
+0

Das nächste Mal versuchen zu zeigen, was Sie bisher versucht haben, und wenn Sie einen Fehler konfrontiert. Sie können sich auch [mcve] und [ask] ansehen. – philantrovert

Antwort

2

Sie können die gewünschten Spalten erhalten mit dem folgenden:

val fetchIndex = List(0, 1, 2, 3, 4, 5, 6, 7, 10, 8, 13) 

val fetchCols = inputFile.columns.zipWithIndex 
        .filter { case (colName, idx) => fetchIndex.contains(idx) } 
        .map(x => col(x._1)) 

inputFile.select(fetchCols : _*) 

Im Grunde, was es tut, ist, zipWithIndex fügen ein kontinuierlicher Index für jedes Element der Sammlung. So können Sie so etwas wie dieses:

df.columns.zipWithIndex.filter { case (data, idx) => a.contains(idx) }.map(x => col(x._1)) 
res8: Array[org.apache.spark.sql.Column] = Array(companyid, event, date_time) 

Und dann können Sie nur verwenden, um die Splat Operator die erzeugte Array übergeben als varargs an die select Funktion.

0

Sie können die folgenden Schritte verwenden, um die columns, die Sie in einem list als Indizes definiert haben, zu erhalten.

Sie können die column names erhalten, indem Sie den folgenden

tun
val names = df.schema.fieldNames 

Und Sie haben eine list von column indexes als

val list = List(0, 1, 2, 3, 4, 5, 6, 7, 10, 8, 13) 

Jetzt können Sie die column namesselect, dass die Indizes, die die list, indem Sie hat die folgenden

val selectCols = list.map(x => names(x)) 

Letzter Schritt ist die select nur die columns dass

Sie sollten die dataframe indem Sie folgendermaßen vorgehen

import org.apache.spark.sql.functions.col 
val selectedDataFrame = df.select(selectCols.map(col): _*) 
ausgewählt wurde, mit Spaltenindizes in der list erwähnt haben.

Hinweis:Indizes in der Liste sollte nicht größer sein als die Spaltenindizes in der dataframe

Verwandte Themen