1

Ich versuche, eine verschachtelte JSON zu speichern, um Rotverschiebung mit den Funken Rotverschiebung SteckernFunken zur Rotverschiebung. Flatten Array String

Das Problem wird akzeptieren Rotverschiebung pflegt die Struktur des Datenrahmen, weil es eine Reihe

Also meine Frage hat, ist Gibt es eine Möglichkeit, das Array der Spalten foo und bar abzuflachen und ihre Werte in eine Zeichenkette umzuwandeln?

hier ist, was ich habe, so weit die Elemente als Array zu erhalten

val basketItems = df.select($"OrderContainer.BasketInfo.BasketId", 
    $"OrderContainer.BasketInfo.MenuId", 
    explode($"OrderContainer.BasketInfo.Items")).toDF("BasketId","MenuId","Items") 

und hier ist die json ich verwende (zur besseren Lesbarkeit formatiert):

{ 
    "OrderContainer":{ 
     "BasketInfo":{ 
     "BasketId":"kjOIxlJFc0WYdQXm2AXksg", 
     "MenuId":119949, 
     "Items":[ 
      { 
       "ProductId":12310, 
       "UnitPrice":5.5, 
       "foo":[1,2,3], 
       "bar":["a","b","c"] 
      }, 
      { 
       "ProductId":456323, 
       "UnitPrice":5.5, 
       "foo":[1,2,3], 
       "bar":["a","b","c"] 
      }, 
      { 
       "ProductId":23432432, 
       "UnitPrice":5.5, 
       "foo":[1,2,3], 
       "bar":["a","b","c"] 
      } 
     ] 
     } 
    } 
} 
+0

Wollen Sie wirklich ein Feld in Ihren Redshift-Daten 'Items' haben, das ein Komma-begrenzter Textdurchbruch ist? Wenn dies der Fall ist, können Sie ein Array mit einem Begrenzer abflachen. Ansonsten könntest du eine separate Tabelle für Items machen – Kristian

+0

Danke @Kristian das ist nur das Schema der Items, es wird überhaupt kein Durcheinander von Text sein. Danke für den Hinweis sowieso :) –

Antwort

0

FYI

Ich habe es gelöst, indem ich eine Funktion erstellt habe, um das Array zu einer Zeichenkette zu machen.

val mkString = udf((a: Seq[Any]) => a.mkString(",")) 

Stellen Sie sicher, dass Sie die udf-Funktion importieren.

Dann alles, was Sie verwenden müssen, ist die withColumn-Funktion.

.withColumn("foo", mkString($"foo"))