Cómo dar columna más condiciones al unir dos dataframes. Por ejemplo yo quiero ejecutar el siguiente :

val Lead_all = Leads.join(Utm_Master,  
    Leaddetails.columns("LeadSource","Utm_Source","Utm_Medium","Utm_Campaign") ==
    Utm_Master.columns("LeadSource","Utm_Source","Utm_Medium","Utm_Campaign"),
"left")

Quiero unirme sólo cuando estas columnas partido. Pero por encima de sintaxis no es válido como cols sólo se necesita una cadena. Así que ¿cómo puedo conseguir lo que quiero.

InformationsquelleAutor user568109 | 2015-07-06

7 Comentarios

  1. 74

    Hay una Chispa columna/expresión de la API de unirse para tal caso:

    Leaddetails.join(
        Utm_Master, 
        Leaddetails("LeadSource") <=> Utm_Master("LeadSource")
            && Leaddetails("Utm_Source") <=> Utm_Master("Utm_Source")
            && Leaddetails("Utm_Medium") <=> Utm_Master("Utm_Medium")
            && Leaddetails("Utm_Campaign") <=> Utm_Master("Utm_Campaign"),
        "left"
    )

    La <=> operador en el ejemplo que significa «Prueba de la igualdad que es seguro para los valores nulos«.

    La principal diferencia con el simple Prueba de la igualdad de (===) es que la primera de ellas es seguro para usar en caso de que una de las columnas puede tener valores null.

    • Podría usted explicar cuál es la diferencia entre === y <=>?
    • Actualizado con más información acerca de la diferencia entre los géneros pruebas.
    • Aha, no podía encontrar esto en la documentación. ¿Cómo te enteraste de esto ?
    • Yo estoy usando el API de Java, y hay algunos casos cuando la Columna/Expresión de la API es la única opción. También, Columna/Expresión de la API se realiza principalmente como un Generador, por lo que es más fácil descubrir nuevos métodos en cada versión de la Chispa.
    • Esto me dio duplicado columnas así que he usado el Seq método he añadido en otra respuesta.
    • Me sale este error cuando se utiliza <=> en lugar de ===. el Uso de la CRUZ de la sintaxis de JOIN para permitir que los productos cartesianos entre estas relaciones.;

  2. 14

    Como de Spark versión 1.5.0 (que actualmente es inédita), usted puede unirse a múltiples DataFrame columnas. Consulte CHISPA-7990: Añadir métodos para facilitar la combinación de varias teclas de combinación.

    Python

    Leads.join(
        Utm_Master, 
        ["LeadSource","Utm_Source","Utm_Medium","Utm_Campaign"],
        "left_outer"
    )
    

    Scala

    La pregunta de una Scala respuesta, pero yo no uso Scala. Aquí está mi mejor conjetura….

    Leads.join(
        Utm_Master,
        Seq("LeadSource","Utm_Source","Utm_Medium","Utm_Campaign"),
        "left_outer"
    )
    
    • ¿cómo podemos hacer la combinación ignorar los valores del caso (es decir, hacer que no distingue mayúsculas de minúsculas)? traté de abajo, y no el trabajo. sqlContext.sql(«conjunto de chispa.sql.distingue mayúsculas de minúsculas=false»)
  3. 6

    Una cosa que puedes hacer es usar raw SQL:

    case class Bar(x1: Int, y1: Int, z1: Int, v1: String)
    case class Foo(x2: Int, y2: Int, z2: Int, v2: String)
    
    val bar = sqlContext.createDataFrame(sc.parallelize(
        Bar(1, 1, 2, "bar") :: Bar(2, 3, 2, "bar") ::
        Bar(3, 1, 2, "bar") :: Nil))
    
    val foo = sqlContext.createDataFrame(sc.parallelize(
        Foo(1, 1, 2, "foo") :: Foo(2, 1, 2, "foo") ::
        Foo(3, 1, 2, "foo") :: Foo(4, 4, 4, "foo") :: Nil))
    
    foo.registerTempTable("foo")
    bar.registerTempTable("bar")
    
    sqlContext.sql(
        "SELECT * FROM foo LEFT JOIN bar ON x1 = x2 AND y1 = y2 AND z1 = z2")
    
    • Este es el método que yo uso ahora mismo. Tenía la esperanza de que puedo hacerlo sin necesidad de registrarse como tablas temporales. Si no hay ninguna manera de hacer esto con el dataframe API voy a aceptar la respuesta.
    • Si es así @rchukh la respuesta es mucho mejor.
  4. 6

    En Pyspark simplemente puede especificar cada condición por separado:

    val Lead_all = Leads.join(Utm_Master,  
        (Leaddetails.LeadSource == Utm_Master.LeadSource) &
        (Leaddetails.Utm_Source == Utm_Master.Utm_Source) &
        (Leaddetails.Utm_Medium == Utm_Master.Utm_Medium) &
        (Leaddetails.Utm_Campaign == Utm_Master.Utm_Campaign))
    

    Sólo asegúrese de utilizar los operadores y paréntesis correctamente.

  5. 5

    Scala:

    Leaddetails.join(
        Utm_Master, 
        Leaddetails("LeadSource") <=> Utm_Master("LeadSource")
            && Leaddetails("Utm_Source") <=> Utm_Master("Utm_Source")
            && Leaddetails("Utm_Medium") <=> Utm_Master("Utm_Medium")
            && Leaddetails("Utm_Campaign") <=> Utm_Master("Utm_Campaign"),
        "left"
    )
    

    Para hacerla insensible a mayúsculas-minúsculas,

    import org.apache.spark.sql.functions.{lower, upper}
    

    utilice sólo lower(value) en la condición de que el método de combinación.

    Por ejemplo: dataFrame.filter(lower(dataFrame.col("vendor")).equalTo("fortinet"))

  6. 1

    La === opciones me dan duplicado columnas. Así que yo uso Seq lugar.

    val Lead_all = Leads.join(Utm_Master,
        Seq("Utm_Source","Utm_Medium","Utm_Campaign"),"left")
    

    Por supuesto, esto sólo funciona cuando los nombres de las columnas de combinación son el mismo.

  7. 0

    Chispa SQL admite la combinación en tupla de columnas cuando entre paréntesis, como

    ... WHERE (list_of_columns1) = (list_of_columns2)
    

    que es un camino más corto que el de la especificación de la igualdad de las expresiones (=) para cada par de columnas combinadas por un conjunto de «Y»s.

    Por ejemplo:

    SELECT a,b,c
    FROM    tab1 t1
    WHERE 
       NOT EXISTS
       (    SELECT 1
            FROM    t1_except_t2_df e
            WHERE (t1.a, t1.b, t1.c) = (e.a, e.b, e.c)
       )
    

    lugar de

    SELECT a,b,c
    FROM    tab1 t1
    WHERE 
       NOT EXISTS
       (    SELECT 1
            FROM    t1_except_t2_df e
            WHERE t1.a=e.a AND t1.b=e.b AND t1.c=e.c
       )
    

    que es menos legible, especialmente cuando la lista de columnas es grande y usted quiere tratar con valores Nulos fácilmente.

    • es realmente trabajo? es esta soportado en la versión 1.6?
    • Yo no lo he probado en 1.6. Esto funciona en 2.x.
    • no funciona en 1.6.

Dejar respuesta

Please enter your comment!
Please enter your name here