2017-08-07 5 views
1

Je voudrais utiliser spark pour générer la sortie de la fonction combn() pour une liste relativement grande d'entrées (200 ish), et pour varier les valeurs de m (2-5), mais j'ai du mal à inclure cela dans spark_apply().Comment utiliser spark_apply() pour générer des combinaisons en utilisant combn()

Une MWe de mon approche actuelle (based on this):

names_df <- data.frame(name = c("Alice", "Bob", "Cat"), 
        types = c("Human", "Human", "Animal")) 

combn(names_df$name, 2) 

name_tbl <- sdf_copy_to(sc = sc, 
         x = names_df, 
         name = "name_table") 

name_tbl %>% 
    select(name) %>% 
    spark_apply(function(e) combn(e, 2)) 

La sortie de message d'erreur est grande, mais je vais avoir du mal à comprendre comment utiliser ces informations pour affiner mon approche.

Je m'attendais à une sortie telle que celle de la deuxième ligne du MWE. Est-ce que le problème combn() attend une "source vectorielle" qui n'est pas ce que je fournis par select()? Ou est-ce que select ne renvoie pas "Un objet (habituellement un spark_tbl) coercible à un Spark DataFrame"? De toute façon, existe-t-il une méthode que je peux utiliser pour atteindre le résultat souhaité?

J'ai aussi essayé dans une tentative sans succès:

name_tbl %>% 
    select(name) %>% # removing this also doesn't work 
    spark_apply(function(e) combn(e$name, 2)) 

EDIT: si expand.grid fonctionne très bien, ce qui me porte à croire qu'il existe un problème avec le retour de combn ne pas pouvoir être sous la contrainte dans un data.frame.

travail expand.grid:

name_tbl %>% 
    spark_apply(function(e) expand.grid(e)) 

EDIT 2:

Après avoir lu de plus près la documentation, j'ai maintenant essayé de contraindre la fonction dans un data.frame comme il est dit:

Votre fonction R doit être conçue pour fonctionner sur une trame de données R. La fonction R transmise à spark_apply attend un DataFrame et renvoie un objet pouvant être converti en DataFrame.

Cependant, les éléments suivants sont également sans succès:

name_tbl %>% 
    spark_apply(function(e) data.frame(combn(e$name, 2))) 

name_tbl %>% 
    select(name) %>% 
    spark_apply(function(e) data.frame(combn(e, 2))) 
+1

Je viens de trouver la fonction 'expand.grid()'. Dans ce cas précis, je ne pense pas en avoir besoin, mais je pense que je le ferai pour la prochaine partie du travail que je dois faire. Je serais intéressé s'il y a un exemple d'utilisation d'étincelle pour appliquer cela aussi bien si possible – DaveRGP

Répondre

1

Le problème semble être que combn() ne fonctionne pas correctement avec les facteurs, le code doit également des colonnes nommées, comme dans:

name_tbl %>% 
    spark_apply(
    function(e) data.frame(combn(as.character(e$name), 2)), 
    names = c("1", "2", "3") 
) 

# Source: table<sparklyr_tmp_626bc0dd927> [?? x 3] 
# Database: spark_connection 
    `1` `2` `3` 
    <chr> <chr> <chr> 
1 Alice Alice Bob 
2 Bob Cat Cat 
+0

Merci pour la solution, et le travail que je sais que vous avez fait sur le projet. Une petite question d'extension car je n'avais pas réalisé que l'argument 'names' était nécessaire. Pourquoi est-ce nécessaire, et comment suggéreriez-vous de lui fournir des valeurs lorsque la longueur de la sortie est très grande? J'ai testé avec succès 'as.character (c (1: choose (3, 2)))'. Y a-t-il quelque chose de plus approprié? – DaveRGP

+0

En outre, à partir des docs pour 'combn':" Les facteurs x sont acceptés à partir de R 3.1.0 (bien que par coïncidence ils aient travaillé pour simplify = FALSE dans les versions antérieures). "Voulez-vous dire que la documentation est incorrecte/incomplète? il y a quelque chose qui se passe dans les coulisses du côté de l'étincelle qui l'empêche d'utiliser des facteurs? – DaveRGP

+1

À droite, générer les noms comme vous le suggérez semble raisonnable.En ce qui concerne, "combn" il supporte des facteurs, j'aurais dû dire qu'utiliser des facteurs comme des intrants aboutit à des facteurs en sortie, forcer "as.character" rend le résultat de "combn" devenir une "matrice" qui peut être enveloppée comme 'data .frame'. Nous devons nous assurer que la fonction 'spark_apply()' renvoie une trame de données, il pourrait y avoir d'autres (mieux?) Façons d'obtenir ceci pour 'combn'. –