Estoy usando la Chispa de la Scala de API. Tengo un Spark SQL DataFrame (lectura de un Avro archivo) con el siguiente esquema:

root
|-- ids: array (nullable = true)
|    |-- element: map (containsNull = true)
|    |    |-- key: integer
|    |    |-- value: string (valueContainsNull = true)
|-- match: array (nullable = true)
|    |-- element: integer (containsNull = true)

Esencialmente 2 columnas de [ id: Lista[Mapa[Int, String]], partido: List[Int] ]. Los datos de ejemplo que se ve como:

[List(Map(1 -> a), Map(2 -> b), Map(3 -> c), Map(4 -> d)),List(0, 0, 1, 0)]
[List(Map(5 -> c), Map(6 -> a), Map(7 -> e), Map(8 -> d)),List(1, 0, 1, 0)]
...

Lo que me gustaría hacer es flatMap() cada fila para producir 3 columnas [id, propiedad, partido]. Utilizando las anteriores 2 filas como los datos de entrada tendríamos:

[1,a,0]
[2,b,0]
[3,c,1]
[4,d,0]
[5,c,1]
[6,a,0]
[7,e,1]
[8,d,0]
...

y, a continuación, groupBy la String propiedad (ej: a, b, …) para producir count("property") y sum("match"):

 a    2    0
 b    1    0
 c    2    2
 d    2    0
 e    1    1

Me gustaría hacer algo como:

val result = myDataFrame.select("ids","match").flatMap( 
    (row: Row) => row.getList[Map[Int,String]](1).toArray() )
result.groupBy("property").agg(Map(
    "property" -> "count",
    "match" -> "sum" ) )

El problema es que la flatMap convierte DataFrame a la RDD. Hay una buena manera de hacer un flatMap tipo de operación seguido por groupBy utilizando DataFrames?

InformationsquelleAutor Yuri Brovman | 2015-05-21

2 Comentarios

  1. 11

    ¿Qué flatMap ¿ que desea? Convierte cada fila de entrada en 0 o más filas. Se puede filtrar hacia fuera, o se pueden añadir otros nuevos. En SQL para obtener la misma funcionalidad que el uso de join. Puedes hacer lo que quieres hacer con un join?

    Alternativamente, también se puede ver en Dataframe.explode, que es sólo un tipo específico de join (usted puede elaborar fácilmente su propio explode uniéndose a un DataFrame a un archivo UDF). explode toma una sola columna como entrada y le permite dividir o convertirlo en varios valores y, a continuación, join la fila original de nuevo en las nuevas filas. Así:

    user      groups
    griffin   mkt,it,admin

    Podría convertirse en:

    user      group
    griffin   mkt
    griffin   it
    griffin   admin

    Así que yo diría que echar un vistazo a DataFrame.explode y si eso no llegar fácilmente, intente une con Udf.

    • Gracias por tu respuesta! El DataFrame.explotar método es exactamente lo que estaba buscando.
  2. 0

    Mi SQL es un poco oxidado, pero una opción es en su flatMap para producir una lista de objetos y, a continuación, usted puede convertir el resultado RDD de nuevo en un DataFrame.

Dejar respuesta

Please enter your comment!
Please enter your name here