2017-05-05 42 views
0

我有我想要做一個完整的加盟使用dplyr兩個表,但我不希望它降大任列。根據文檔和我自己的經驗,它只保留左側的連接列。這是一個問題,因爲連接值已經消失,因此右側有一行記錄。是否有可能在dplyr中進行完全連接並保留連接中使用的所有列?

例如,假設我有兩個表A和B,

customerId | revenue    customerId | state 
-----------|---------    -----------|------- 
    1  | 2000      1  | CA 
    2  | 3000      3  | GA 
    4  | 4000      4  | NY 

做這樣full_join(a, b, by="customerId")東西會產生

customerId | revenue | state 
-----------|---------|------- 
    1  | 2000 | CA 
    2  | 3000 | <NA> 
    <NA> | <NA> | GA 
    4  | 4000 | NY 

所以沒有辦法判斷哪些客戶是第三排從。理想的輸出將是

customerId.a | customerId.b | revenue | state 
-------------|--------------|---------|------- 
     1  |  1  | 2000 | CA 
     2  |  <NA>  | 3000 | <NA> 
    <NA>  |  3  | <NA> | GA 
     4  |  4  | 4000 | NY 

請注意,這只是一個玩具的例子。我實際上使用sparklyr,所以這一切都在Spark中運行。因此,合併在這裏對我來說不起作用。有沒有辦法做到我在dplyr中尋找的東西?

編輯: 正如有人指出,這實際上是工作在dplyr本身所需的本地。但是,我確實使用sparklyr(使用dplyr)來查看此問題。下面是代碼的看到:

library(sparklyr) 
sc <- spark_connect("local[4]") 
d1 <- data_frame(customerId = c("1","2","4"), revenue=c(2000,3000,4000)) 
d2 <- data_frame(customerId = c("1","3","4"), state=c("CA", "GA", "NY")) 
d1_tbl <- copy_to(sc, d1) 
d2_tbl <- copy_to(sc, d2) 
full_join(d1_tbl, d2_tbl, by=c("customerId")) 
+2

這裏提交的問題:https://開頭github上。 COM/rstudio/sparklyr /問題/ 663。謝謝! – kevinykuo

回答

3

我無法重現你的問題。所有的ID都應該(並且)包含在完整聯接中。

library(data_frame) 
d1 <- data_frame(
    customerId = c(1, 2, 4), 
    revenue = c(2000, 3000, 4000) 
) 
d2 <- data_frame(
    customerId = c(1, 3, 4), 
    state = c("CA", "GA", "NY") 
) 

full_join(d1, d2, by = "customerId") 
## # A tibble: 4 × 3 
## customerId revenue state 
##  <dbl> <dbl> <chr> 
## 1   1 2000 CA 
## 2   2 3000 <NA> 
## 3   4 4000 NY 
## 4   3  NA GA 

更新:我可以重現使用sparklyr問題。這是奇怪的行爲,所以你可能想提出問題。 (這個問題目前還不清楚是否是sparklyrdplyrDBI或火花SQL雖然)。

使用explain(),你可以看到生成的SQL。

full_join(d1_tbl, d2_tbl, by=c("customerId")) %>% explain() 

你可以嘗試運行一個自定義的SQL查詢來獲取你想要的東西,雖然這是一個有點混亂。

library(DBI) 
qry <- "SELECT 
    d1.customerID AS customerID1, 
    d2.customerID AS customerID2, 
    d1.revenue, 
    d2.state 
    FROM d1 
    FULL JOIN d2 
    ON d1.customerId = d2.customerId" 
dbGetQuery(sc, qry) 
## customerID1 customerID2 revenue state 
## 1   1   1 2000 CA 
## 2   2  <NA> 3000 <NA> 
## 3  <NA>   3  NaN GA 
## 4   4   4 4000 NY 
+0

謝謝你指出。我應該先嚐試一下自己。很有意思。這絕對不是我看到使用sparklyr的行爲。我將創建一個代碼示例來演示和更新我的問題。 –

4

可以之前創建的兩個數據幀分開相同customerId加入

full_join(
    mutate(a, customerId.a = customerId), 
    mutate(b, customerId.b = customerId), 
    by="customerId" 
) %>% select(-customerId) 

# revenue customerId.a state customerId.b 
#1 2000   1 CA   1 
#2 3000   2 <NA>   NA 
#3 4000   4 NY   4 
#4  NA   NA GA   3 
+0

我喜歡這個想法,可能會嘗試作爲解決辦法。然而正如Richie指出的那樣,dplyr本身也可以工作。雖然使用sparklyr,但行爲不同。 –

1

這一直是固定

> full_join(d1_tbl, d2_tbl, by="customerId") 
# Source: lazy query [?? x 3] 
# Database: spark_connection 
    customerId revenue state 
     <chr> <dbl> <chr> 
1   1 2000 CA 
2   3  NaN GA 
3   2 3000 <NA> 
4   4 4000 NY 
相關問題