2017-04-09 11 views
1

私はsparklyrライブラリを使用しています。計算を行うSpark(R)

私はスパークにコピー変数、wtdを持っている:

copy_to(sc,wtd) 
colnames(wtd) <- c("a","b","c","d","e","f","g") 

その後、私は計算を行うと、私がしようとすると、スパークではなく、R.

で私の環境でそれを保存したいです:UseMethodで

sdf_register(wtd %>% group_by(c,b) %>% filter(row_number()==1) %>%count(d), "wtd2") 

エラー( "sdf_register"): なし適用可能な方法「sdf_register」のwtd2 = wtd %>% group_by(c,b) %>% filter(row_number()==1) %>%count(d)正常に動作「( 『TBL』、 『data.frame』 『tbl_df』)C」

コマンドクラスのオブジェクトに適用されるが、それは、私の環境で保管しないであろう火花の中に。

答えて

3

操作シーケンスの最初の引数は、通常のdata.frameではなく、 "tbl_spark"でなければなりません。あなたのコマンド、

wtd2 = wtd %>% group_by(c,b) %>% filter(row_number()==1) %>%count(d) 

作品あなたがすべてでスパークを使用していないので、普通のR data.frames。あなたが最初に、スパークとそれを使用したい場合は

あなたdata.frameをコピーするとき、返されspark_tbl変数を格納します。

colnames(wtd) <- c("a","b","c","d","e","f","g") 
wtd_tbl <- copy_to(sc, wtd) 

その後、あなたはsdf_register(wtd_tbl %>% ..., "wtd2")を使用して、データパイプラインを実行することができます。

定義されるように、あなたがパイプラインを実行すると、あなたは例外と言ってしまいます:スパークでrow_number()を使用するためには、まずあなたが「注文機能」を提供する必要があるため

Error: org.apache.spark.sql.AnalysisException: Window function rownumber() requires window to be ordered 

これがあります。これはarrange()とすることができます。

sdf_register(wtd_tbl %>% 
       dplyr::group_by(c, b) %>% 
       arrange(c, b) %>% 
       dplyr::filter(row_number() == 1) %>% 
       dplyr::count(d), 
      "wtd2") 

私はこのことができます願っています:私はあなたの最後のパイプラインはこのようなものになるだろうので、あなたの行が列「C」と「B」、が注文した場合を想定しています。

+1

ありがとうございます!それが助けになった! –

+0

@JaimeCaffarelこれは面白いです、あなたの答えはこの瞬間に私を助けてくれます!! :)私が得ないものは、 'copy_to'と' sdf_register'の実行の違いは何ですか。どちらの場合でもスパークデータフローを作成できますか? –

+1

@Noobieありがとう:-)違いは、 'copy_to'はデータフレームをSparkにコピーするだけですが、' sdf_register'はデータフレームのHiveメタデータを作成するので、Hiveを使ってデータをチェックすることができます(テーブル "wtd2"この場合)。 –