2016-04-07 13 views
3

みましょう、私は次のようにデータフレームを持っていると言う:Sparkの配列列からフィールドのサブセットを選択する方法は?

case class SubClass(id:String, size:Int,useless:String) 
case class MotherClass(subClasss: Array[SubClass]) 
val df = sqlContext.createDataFrame(List(
     MotherClass(Array(
     SubClass("1",1,"thisIsUseless"), 
     SubClass("2",2,"thisIsUseless"), 
     SubClass("3",3,"thisIsUseless") 
    )), 
     MotherClass(Array(
     SubClass("4",4,"thisIsUseless"), 
     SubClass("5",5,"thisIsUseless") 
    )) 
    )) 

スキーマは次のとおりです。

root 
|-- subClasss: array (nullable = true) 
| |-- element: struct (containsNull = true) 
| | |-- id: string (nullable = true) 
| | |-- size: integer (nullable = false) 
| | |-- useless: string (nullable = true) 

私は、フィールドのサブセットのみを選択するための方法を探しています:配列のidsizesubClasssが、ネストされた配列構造を保持しています。 結果のスキーマは次のようになります。

root 
    |-- subClasss: array (nullable = true) 
    | |-- element: struct (containsNull = true) 
    | | |-- id: string (nullable = true) 
    | | |-- size: integer (nullable = false) 

私は

df.select("subClasss.id","subClasss.size") 

を行うことを試みた。しかし、これは2列に配列subClasssを分割:

root 
|-- id: array (nullable = true) 
| |-- element: string (containsNull = true) 
|-- size: array (nullable = true) 
| |-- element: integer (containsNull = true) 

する方法があります元の構造を維持し、uselessフィールドを削除するだけですか?次のようなものがあります:

df.select("subClasss.[id,size]") 

ありがとうございます。

答えて

4

あなたはこのようにUDFを使用することができます。

import org.apache.spark.sql.Row 

case class Record(id: String, size: Int) 

val dropUseless = udf((xs: Seq[Row]) => xs.map{ 
    case Row(id: String, size: Int, _) => Record(id, size) 
}) 

df.select(dropUseless($"subClasss")) 
関連する問題