こんにちは、ありがとうございます。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":{}}]})
あなたはその後、戻り値の型の中としてそのデータ型を使用することができます。
は