2016-09-08 17 views
1

のは、私は次のように何かを実行したいとしましょう:SparkR gapply - 関数は、複数行のRのデータフレームを返す

関数の戻り値は、複数の行を持っている
library(SparkR) 
... 
df = spark.read.parquet(<some_address>) 
df.gapply(
    df, 
    df$column1, 
    function(key, x) { 
     return(data.frame(x, newcol1=f1(x), newcol2=f2(x)) 
    } 
) 

。明確にするために、ドキュメントの例(悲しいことに、Sparkマニュアルの例がほんの少し単純なところにある)は、これが私が期待したとおりに処理されるかどうかを識別するのに役立ちません。

gapply()呼び出しの結果にsum(1..k、n_k)行が含まれるように、グループごとにn_k出力行を持つDataFrameで作成されたk個のグループの結果は、ここで、キー値は、キーkの各グループのn_k行ごとに複製されます...しかし、スキーマフィールドは、これがどのように処理されるかではないことを私に示唆しています。結果は単一の行にプッシュされます。

これは明らかですが、理論的です(私の実際のコード例は分かりません)。誰かがそのような機能が実際にどのように扱われるかを検証し説明することができますか?

答えて

0

入力と出力に関する正確な期待を明確にthe official documentationに記載されている:

SparkDataFrameの各グループに関数を適用します。この関数は、SparkDataFrameの各グループに適用され、そのキーに対応するグループ化キーとR data.frameの2つのパラメータのみを持つ必要があります。群は、SparkDataFrames列から選択される。関数の出力はdata.frameでなければなりません。

スキーマは結果の行形式を指定しますSparkDataFrame。 Sparkのデータ型に基づいて、R関数の出力スキーマを表す必要があります。返されるdata.frameの列名はユーザーが設定します。以下は、RとSparkの間のデータ型マッピングです。

言い換えれば、あなたの関数は、そのキーに対応する行のkeydata.frameを取り、schema引数として提供されたスキーマとスパークSQLタイプを使用して表すことができるdata.frameを返す必要があります。行数に制限はありません。次のようにして、例えば恒等変換を適用することができます:

df <- as.DataFrame(iris) 

gapply(df, "Species", function(k, x) x, schema(df)) 

集計と同じように:

gapply(df, "Species", 
    function(k, x) { 
    dplyr::summarize(dplyr::group_by(x, Species), max(Sepal_Width)) 
    }, 
    structType(
    structField("species", "string"), 
    structField("max_s_width", "double")) 
) 

実際にあなたがDataFramegroupBy %>% agg)に直接集計を好むべきです。

+0

投稿ごとのルール私はすでにドキュメントをよく読んでおり、ドキュメントの明快さは見る人の目線です(複数行のデータフレームが許可されているかどうかはっきりしませんでした。 )。恒等変換は明白な例になるでしょう。もしそれがうまくいくならば、それはドキュメントの中にあるべきです - そうではありません。また、2番目のサンプル関数は、外側にある種によってグループ化しているので、内側の列にはグループ化しているので、1行しか返さないでしょう。内部のdpylr :: group_byは冗長です。 –

+0

2番目の例は、行の数が入力の行の数と異なる場合があることを示しています。実際に 'gapply'は' dplyr :: group_by%>%dplyr :: summarize'や 'split%>%lapply'と同等のものだと考えています – zero323

+0

それでも、アイデンティティといくつかの他の例を実行して自分で確認しました複数行のデータフレームを返すことは有効です。この回答を受け入れ、SparkRの文書に関する警告にもかかわらず。 –

関連する問題