2016-09-28 6 views
5

こんにちは、ありがとうございます。spark UDFを使用して複合型を返す方法

私のプログラムはjavaで書かれており、私はscalaに移動できません。

私は現在、次の行を使用してJSONファイルから抽出されたスパークDATAFRAMEで働いています:

DataFrame dff = sqlContext.read().json("filePath.son");

SQLContextとSparkContextが正しくinitialziedされ、完璧に動作します。

問題は、私が読んでいるjsonがネストされた構造体を持っているため、スキーマを変更せずに内部データをクリーン/検証したいという問題です。

特に、データフレームの列の1つに「GenericRowWithSchema」タイプがあります。

「データ」という名前の列だけをクリーニングしたいとしましょう。

私の頭に浮かんだ解決策は、「cleanDataField」という名前のユーザー定義関数(UDF)を定義し、それを「データ」列で実行することでした。

sqlContext.udf().register("cleanDataField", cleanDataField, DataTypes.StringType); 

を、その後、私は最初の10を見るために

df.selectExpr("cleanDataField(data)").show(10, false);

を呼び出します。

UDF1<GenericRowWithSchema,GenericRowWithSchema> cleanDataField = new UDF1<GenericRowWithSchema, GenericRowWithSchema>(){ 

     public GenericRowWithSchema call(GenericRowWithSchema grws){ 

      cleanGenericRowWithSchema(grws); 

      return grws; 

     } 
    }; 

が、私はSQLContextに関数を登録します:ここでは、コードですクリーンなデータを持つ行

最終的に質問の結果は次のようになります。複雑なデータ(カスタムクラスオブジェクトなど)を返すことはできますか? 可能であれば、どうすればいいですか?私は文字列を返すわけではないので、udf登録の第3パラメータを変更する必要があると思いますが、何を置き換えるべきですか?

// I am just copying the json string as is but you will need to escape it properly for java. 

DataType dt = DataType.fromJson({"type":"struct","fields":[{"name":"companyid","type":"string","nullable":false,"metadata":{}},{"name":"loyaltynum","type":"integer","nullable":false,"metadata":{}},{"name":"totalprice","type":"integer","nullable":false,"metadata":{}},{"name":"itemcount","type":"integer","nullable":false,"metadata":{}}]}) 

あなたはその後、戻り値の型の中としてそのデータ型を使用することができます。

答えて

1

は、あなたが、あなたが次の操作を行うことができます。このためstruct<companyid:string,loyaltynum:int,totalprice:int,itemcount:int>

としてデータ型を構築したいとしましょうありがとうあなたのUDFを登録する。

関連する問題