2017-08-30 26 views
1

私はスカラーとスパークにはとても新しいです。Scala Spark:データフレームの列を動的に分割する

私は、これは動作します

val irisDF:DataFrame = spark.read.csv("src/test/resources/iris-in.txt") 

    irisDF.show() 

    val dfnew:DataFrame = irisDF.withColumn("_tmp", split($"_c0", " ")).select(
    $"_tmp".getItem(0).as("col1"), 
    $"_tmp".getItem(1).as("col2"), 
    $"_tmp".getItem(2).as("col3"), 
    $"_tmp".getItem(3).as("col4") 
).drop("_tmp") 

(基本的にファイルがSPACE区切りCSV形式で)データフレームにテキストファイルを読み込み、成功した列に単一の列を分割しています。

しかし、データファイルにいくつの列があるかわからない場合はどうすればよいですか?分割機能によって生成されるアイテムの数に応じて、列を動的に生成するにはどうすればよいですか?

答えて

2

あなたが選択式の列を作成し、:_*の構文でselect方法にそれらのすべてを適用することができます:あなたはc0から5列にしたい場合

val df = Seq("a b c d", "e f g").toDF("c0") 

df.show 
+-------+ 
|  c0| 
+-------+ 
|a b c d| 
| e f g| 
+-------+ 

例のデータこれを行う前に決定する必要があります:

val selectExprs = 0 until 5 map (i => $"temp".getItem(i).as(s"col$i")) 

df.withColumn("temp", split($"c0", " ")).select(selectExprs:_*).show 
+----+----+----+----+----+ 
|col0|col1|col2|col3|col4| 
+----+----+----+----+----+ 
| a| b| c| d|null| 
| e| f| g|null|null| 
+----+----+----+----+----+ 
+1

作品が好き夢 – Jake

関連する問題