2016-04-09 10 views
0

Aufgabe: möchte ich den Wert child_id Spalte [Which is generated using withColumn() method and monoliticallyIncreasingId() method] entsprechend family_id und id Spalte.Unexpected Spaltenwerte nach dem Zustand, in dem IN() Methode von Datenrahmen in Funken

Lassen Sie mich Schritte erklären, meine Aufgabe zu erfüllen:

Schritt 1: 1. Zugabe von 2 Spalten der Datenrahmen. 1 mit eindeutiger ID und benannt als child_id und eine andere mit dem Wert 0 und named parent_id.

Schritt 2: benötigen alle family_ids von Dataframe.

Schritt 3: möchte den Datenrahmen von child_id und ID, wobei ID == family_id. [Problem ist hier.]

def processFoHierarchical(param_df: DataFrame) { 
    var dff = param_df.withColumn("child_id", monotonicallyIncreasingId() + 1) 
    println("Something is not gud...") 
    dff = dff.withColumn("parent_id", lit(0.toLong)) 
    dff.select("id","family_id","child_id").show() // Original dataframe. 

    var family_ids = "" 
    param_df.select("family_id").distinct().coalesce(1).collect().map(x => family_ids = family_ids + "'" + x.getAs[String]("family_id") + "',") 
    println(family_ids) 
    var x: DataFrame = null 

    if (family_ids.length() > 0) { 
     family_ids = family_ids.substring(0, family_ids.length() - 1) 
     val y = dff.where(" id IN (" + family_ids + ")").select("id","family_id","child_id") 
     y.show() // here i am getting unexpected values. 
    } 

Dies ist der Ausgang meines Codes ist. Ich versuche, die child_id-Werte wie in Dataframe zu erhalten. aber ich verstehe es nicht. Hinweis: Mit Spark mit Scala.

+--------------------+--------------------+----------+ 
|     id|   family_id| child_id| 
+--------------------+--------------------+----------+ 
|fe60c680-eb59-11e...|fe60c680-eb59-11e...|   4| 
|8d9680a0-ec14-11e...|8d9680a0-ec14-11e...|   9| 
|ff81457a-e9cf-11e...|ff81457a-e9cf-11e...|   5| 
|4261cca0-f0e9-11e...|4261cca0-f0e9-11e...|  10| 
|98c7dc00-f0e5-11e...|98c7dc00-f0e5-11e...|   8| 
|dca16200-e462-11e...|dca16200-e462-11e...|8589934595| 
|78be8950-ecca-11e...|ff81457a-e9cf-11e...|   1| 
|4cc19690-e819-11e...|ff81457a-e9cf-11e...|   3| 
|dca16200-e462-11e...|ff81457a-e9cf-11e...|8589934596| 
|72dd0250-eff4-11e...|78be8950-ecca-11e...|   2| 
|84ed0df0-e81a-11e...|78be8950-ecca-11e...|   6| 
|78be8951-ecca-11e...|78be8950-ecca-11e...|   7| 
|d1515310-e9ad-11e...|78be8951-ecca-11e...|8589934593| 
|d1515310-e9ad-11e...|72dd0250-eff4-11e...|8589934594| 
+--------------------+--------------------+----------+ 

'72dd0250-eff4-11e5-9ce9-5e5517507c66','dca16200-e462-11e5-90ec-c1cf090b354c','78be8951-ecca-11e5-a5f5-c1cf090b354c','4261cca0-f0e9-11e5-bbba-c1cf090b354c','98c7dc00-f0e5-11e5-bc76-c1cf090b354c','fe60c680-eb59-11e5-9582-c1cf090b354c','ff81457a-e9cf-11e5-9ce9-5e5517507c66','8d9680a0-ec14-11e5-a94f-c1cf090b354c','78be8950-ecca-11e5-a5f5-c1cf090b354c', 
+--------------------+--------------------+-----------+ 
|     id|   family_id| child_id| 
+--------------------+--------------------+-----------+ 
|fe60c680-eb59-11e...|fe60c680-eb59-11e...|   1| 
|ff81457a-e9cf-11e...|ff81457a-e9cf-11e...|   2| 
|98c7dc00-f0e5-11e...|98c7dc00-f0e5-11e...|   3| 
|8d9680a0-ec14-11e...|8d9680a0-ec14-11e...|   4| 
|4261cca0-f0e9-11e...|4261cca0-f0e9-11e...|   5| 
|dca16200-e462-11e...|dca16200-e462-11e...|   6| 
|78be8950-ecca-11e...|ff81457a-e9cf-11e...| 8589934593| 
|dca16200-e462-11e...|ff81457a-e9cf-11e...| 8589934594| 
|72dd0250-eff4-11e...|78be8950-ecca-11e...|17179869185| 
|78be8951-ecca-11e...|78be8950-ecca-11e...|17179869186| 
+--------------------+--------------------+-----------+ 

Ich weiß, dass es keine aufeinanderfolgenden Werte erzeugt, diese Werte sind abhängig von Partitionen. Unerwartete Werte bedeuten (siehe 2. Datenframe), dass die child_ids aus dem vorherigen Datenframe gehören sollen, wo family_id = id ist und um mehrere IDs zu identifizieren, verwende ich IN. Unerwartete Werte bedeutet hier, dass die Spalte child_id keine Werte aus dem obigen Datenframe hat, stattdessen erstellt sie eine neue Spalte child_id mit monoliticilyIncresingIds().

Die letzten 2 Werte im 2. Datenrahmen gehören nicht zum obigen Datenrahmen. Woher kommt es? Ich verwende monoliticallyIncresingIds() nicht erneut auf Datenrahmen. Also, warum es so aussieht, dass die Spalte (child_id) mit den Werten wie monoliticallyIncresingIds() erneut angewendet wird.

+2

Warum sind diese "unerwarteten Werte"? Was sind die _expected_ Werte? Beachten Sie, dass 'monoliticallyIncreasingId' nicht notwendigerweise _consecutive_-Werte erzeugt, so dass diese" Sprünge "von ~ 6 auf ~ 8 Milliarden bedeutet nicht, dass 8 Milliarden Datensätze übersprungen wurden. Siehe https://github.com/apache/spark/blob/master/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/MonotonicallyIncreasingID.scala # L28 –

+0

Ich weiß, dass es keine aufeinanderfolgenden Werte erzeugt, diese Werte hängen von Partitionen ab. Unerwartete Werte bedeuten (siehe 2. Datenframe), dass die child_ids aus dem vorherigen Datenframe gehören sollen, wo family_id = id ist und um mehrere IDs zu identifizieren, verwende ich IN. Unerwartete Werte bedeutet hier, dass die Spalte child_id keine Werte aus dem obigen Datenframe hat, stattdessen wird eine neue Spalte child_id mit 'monoliticilyIncresingIds()' erstellt. –

+0

kann mir jemand vorschlagen, welche Art von Informationen ich zur Klärung der Frage hinzufügen soll. So kann es betrachtet oder wieder geöffnet werden. Oder Sie können mir vorschlagen, was Sie nicht bekommen haben. Ich werde Erklärung in meiner Frage hinzufügen, wie ich kürzlich tat. –

Antwort

1

Das Problem ist jedoch nicht mit Funken DataFrame. Wenn wir monoliticlyIncresingId() mit DataFrame verwenden, erstellt es neue ID für jedes Mal auf DataFrame.show().

Wenn wir ID einmal generieren müssen und dieselbe ID an anderer Stelle im Code referenzieren müssen, müssen wir möglicherweise DataFrame.cache().

In Ihrem Fall müssen Sie Datenrahmen nach Schritt 1 so wird doppelte child_id auf zeigt jedes Mal nicht schafft es in den Cache().

+0

Nun, was Sie sagen, ist korrekt, wie ich es getestet habe. Aber ich konnte es nicht verstehen. Wie und warum tritt es tatsächlich auf? Übrigens Thanxx .. @Uttam Kasundara –

Verwandte Themen