2017-05-05 30 views
1

我有一個數據幀如下團結:功能tidyr的收集和使用

library(tidyverse) 
m <- matrix(rep(1:28,each = 10), ncol = 28) 
colnames(m) <- c("co1","col2", LETTERS) 
df <- as_tibble(m) 
df 

newdf<-df %>% 
unite("newcol", c(col1, col2), sep = " ", remove=F) %>% 
gather("col4", "col5", A:Z) 

我想寫以下,並將它在sparklyr工作:

dataframe %>% 
    unite(newcol, col1, col2, sep = " ", remove=F) %>% 
    gather("col4", "col5", A:Z) 

團結:凡NEWCOL是包含col1和col2的統一值的新列名稱。

收集:其中A:Z是放置在新col4中的鍵。 col5是將包含當前列A中的變量的新列:Z

有沒有人有包裝器的用戶定義函數,它會在spraklyr包中使用SQL進行收集和聯合函數?

+0

我沒試過在sparklyr,但也有一些dplyr後端可以只包住功能'do'和數據傳遞的'.' – alistaire

+1

我猜測你已經看到這是sparklyr GitHub上的問題#255。我也想找到一個臨時解決方案。 – Zafar

回答

3

您可以使用SQL和DBI庫來實現。

假設您已將您的data.frame複製到Spark中。 (請注意,在colnames函數調用中存在拼寫錯誤,您已將第一列的名稱設置爲「co1」,而不是「col1」)。現在

copy_to(sc, df) 

,您可以創建一個新的Spark表所需的列有這樣的:

DBI::dbSendQuery(sc, "CREATE TABLE new_df AS 
SELECT CONCAT(t1.col1, t1.col2) AS newcol, t1.col1, t1.col2, t2.col4, t2.col5 
FROM df t1 
      LATERAL VIEW EXPLODE (map('A', A, 'B', B, 'C', C, 'D', D, 'E', E, 'F', F, 'G', G, 
      'H', H, 'I', I, 'J', J, 'K', K, 'L', L, 'M', M, 'N', N, 'O', O, 'P', P, 'Q', Q, 
      'R', R, 'S', S, 'T', T, 'U', U, 'V', V, 'W', W, 'X', X, 'Y', Y, 'Z', Z)) t2 as col4, col5 ORDER BY col4 DESC") 

現在,你可以參考這個新的Spark表和Sparklyr使用它:

ref_new_df <- tbl(sc, "new_df") 

我希望這會有所幫助。

編輯來顯示結果

> copy_to(sc, df) 
> DBI::dbSendQuery(sc, "CREATE TABLE new_df AS 
+ SELECT CONCAT(t1.col1, t1.col2) AS newcol, t1.col1, t1.col2, t2.col4, t2.col5 
+ FROM df t1 
+    LATERAL VIEW EXPLODE (map('A', A, 'B', B, 'C', C, 'D', D, 'E', E, 'F', F, 'G', G, 
+    'H', H, 'I', I, 'J', J, 'K', K, 'L', L, 'M', M, 'N', N, 'O', O, 'P', P, 'Q', Q, 
+    'R', R, 'S', S, 'T', T, 'U', U, 'V', V, 'W', W, 'X', X, 'Y', Y, 'Z', Z)) t2 as col4, col5 ORDER BY col4 DESC") 
<DBISparkResult> 
    SQL CREATE TABLE new_df AS 
SELECT CONCAT(t1.col1, t1.col2) AS newcol, t1.col1, t1.col2, t2.col4, t2.col5 
FROM df t1 
      LATERAL VIEW EXPLODE (map('A', A, 'B', B, 'C', C, 'D', D, 'E', E, 'F', F, 'G', G, 
      'H', H, 'I', I, 'J', J, 'K', K, 'L', L, 'M', M, 'N', N, 'O', O, 'P', P, 'Q', Q, 
      'R', R, 'S', S, 'T', T, 'U', U, 'V', V, 'W', W, 'X', X, 'Y', Y, 'Z', Z)) t2 as col4, col5 ORDER BY col4 DESC 
    ROWS Fetched: 0 [complete] 
     Changed: 0 
+1

感謝您的支持。當我運行這個命令時,我得到以下錯誤: 不匹配的輸入'LATERAL'期待{,'GROUP','ORDER','HAVING','LIMIT','OR','AND','WINDOW',' (第4行,後20) == SQL == CREATE TABLE new_df AS SELECT CONCAT(t1.col1, t1.col2)as newcol t1.col1,t1.col2,t2.col4,t2.col5 FROM df WHERE t1 IS NOT NULL LATERAL VIEW EXPLODE(地圖('A',A,'B',B, - ------------------- ^^^ ' –

+1

@LeviBrackman它適用於我,我編輯了答案,顯示我得到的結果。請檢查語法?也許這是一個錯字。另外,你能否檢查列名是否正確? –

+0

@JaimeCaffarel這是一個了不起的解決方案。我有一個類似的問題,我收到以下警告'dbGetQuery(sc,query) 警告消息: 在max(n):沒有非缺少參數爲max;返回-Inf'你知道這意味着什麼嗎?謝謝!!!! –