2017-11-03 4 views
-1

リスト(0,1,2,3,4,5,6,7,10,8,13)リストがあり、テキストファイルからの入力を読み取るデータフレームを持っていますヘッダーはありません。私はそのデータフレーム(inputFile)から私のリストに記載されている列を取得したい。私の入力ファイルより20列を持っていますが、私はあなたが以下を使用して、必要な列を取得することができます私のリストにsparkのリストに基づいて列を取得する

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

次の時間に存在する列のインデックスより大きくすべきではない、あなたが今まで試みているものを紹介しようと、あなたはどんなエラーに直面した場合。 [mcve]と[ask]もご覧ください。 – philantrovert

答えて

2

を述べた列のみを取得したい:基本的にはそれが何をするかである

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 : _*) 

zipWithIndexが追加されますコレクションの各要素への連続インデックス。ですから、このような何かを得る:

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) 

をそしてあなただけのselect関数に可変引数として生成配列を渡すスプラット演算子を使用することができます。

0

listで定義したcolumnsをインデックスとして取得するには、次の手順を実行します。

val names = df.schema.fieldNames 

を行うことによってcolumn namesを取得することができますそして、あなたは今、あなたはlistを行うことでありcolumn namesそのインデックスをselectでき

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

としてcolumn indexeslistを持っています次のもの:

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

最終ステップはselectにあなたがlistに言及した列インデックスとdataframeを持っている必要があり、次の

import org.apache.spark.sql.functions.col 
val selectedDataFrame = df.select(selectCols.map(col): _*) 

を行うことによって選択されている唯一のcolumnsです。

注:リストでインデックスがdataframe

関連する問題