2016-07-19 1 views
0

再帰関数を構築する。Spark:spark arrayTypeを式として反復する方法

def loop(path: String, dt: DataType, acc:Seq[String]): Seq[String] = { 
    dt match { 
    case s: ArrayType => 
     s.fields.flatMap(f => loop(path + "." + f.name, f.dataType, acc)) 
    case s: StructType =>  
    s.fields.flatMap(f => loop(path + "." + f.name, f.dataType, acc)) 
    case other => 
    acc:+ path 
} 

私はというエラーを持っている「エラー:値フィールドがorg.apache.spark.sql.types.ArrayTypeのメンバーではありません」。ですから、arrayTypeの各要素を反復処理し、文字列の平坦なシーケンスを返すにはどうすればよいですか?

+0

あなたがいないを使用しています。個々の値はスキーマに反映されません。 – zero323

+0

それ以外は私のスキーマは、structTypeの要素を含むように見えます。ループを解析して文字列の平坦なシーケンスを返すようにしたいと思います。 – MichM

+0

それはありません。 'ArrayType'のスキーマに反映されるのは、要素の型だけです。配列の型にアクセスしますか?もしそうなら 'f.dataType'を使います。 – zero323

答えて

0

トリックは.elementType

def loop(path: String, dt: DataType, acc:Seq[String]): Seq[String] = { 
    dt match { 
    case s: ArrayType => 
     loop(path, s.elementType, acc) 
    case s: StructType =>  
    s.fields.flatMap(f => loop(path + "." + f.name, f.dataType, acc)) 
    case other => 
    acc:+ path 
} 
関連する問題