2017-11-27 1 views
1

SparkとScalaの新機能です。いくつかのSpark DataFrameカラムタイプを動的に変更することができます。

GoogleにはJSONを供給する外部データソースがあります。このJSONには、numberフィールドとbooleanフィールドを含むすべての値が引用符で囲まれています。だから私はそれを私のDataFrameにすべての列を文字列です取得します。最終目標は、これらのJSONレコードを適切に型付けされたParquetファイルに変換することです。

約100個のフィールドがあり、string、int、boolean、またはbigint(long)からいくつかの型を変更する必要があります。さらに、処理する各DataFrameには、これらのフィールドのサブセットのみが含まれています。したがって、DataFrameの列のサブセットを処理し、各列を既知の列型リストと比較し、DataFrameに表示される列に応じてstringからint、bigint、およびbooleanに特定の列をキャストできなければなりません。

最後に、将来的に新しい列があり、古い列を削除または変更したい場合があるので、構成可能な列の種類の一覧が必要です。

だから、ここで私がこれまで持っているものです。

// first I convert to all lower case for column names 
val df = dfIn.toDF(dfIn.columns map(_.toLowerCase): _*) 

// Big mapping to change types 
// TODO how would I make this configurable? 
// I'd like to drive this list from an external config file. 
val dfOut = df.select(
    df.columns.map { 

    ///// Boolean 
    case a @ "a" => df(a).cast(BooleanType).as(a) 
    case b @ "b" => df(b).cast(BooleanType).as(b) 

    ///// Integer 
    case i @ "i" => df(i).cast(IntegerType).as(i) 
    case j @ "j" => df(j).cast(IntegerType).as(j) 


    // Bigint to Double 
    case x @ "x" => df(x).cast(DoubleType).as(x) 
    case y @ "y" => df(y).cast(DoubleType).as(y) 

    case other   => df(other) 
    }: _* 
) 

は、これは私がScalaで欲しいタイプを有することに、このデータを変換するための良い効率的な方法ですか?

私は列の種類を定義できる外部の 'config'ファイルからこれを守る方法についていくつかのアドバイスを利用することができました。

答えて

関連する問題