[FIXED] Suchen Sie in einem mehrdimensionalen Array mit Regex in Spark

Ausgabe

Ich habe die folgende Tabellenspalte namens data mit der folgenden Struktur:

{
  "data":[
      {
        "id":"test_111",
        "sum":"10"
      },
      {
        "id":"skip",
        "sum":"74"
       }
    ]
  }

Ich möchte alle Datensätze extrahieren, die mindestens 1 Datensatz im Datenobjekt haben , das eine ID hat, die mit test_{d} beginnt (wobei {d} Ziffern sind). Das heißt, wenn ich einen anderen Datensatz mit diesem Wert habe

 {
   "data":[
       {
          "id":"skip_this_too",
          "sum":"123"
        },
        {
          "id":"skip",
          "sum":"11"
         }
     ]
 }

Ich möchte es überspringen. Ich habe versucht, die Funktion array_contains von Scala zu verwenden , aber sie kann nicht in einem mehrdimensionalen Array implementiert werden. Auch wenn ich diese Bedingung versuche:

WHERE data.data[0].id LIKE 'test_%'

Es funktioniert, aber ich bin mir nicht sicher, wie ich dieselbe Bedingung für alle Datenelemente implementieren soll. Jede Hilfe wird geschätzt!

Lösung

Erwägen Sie die Verwendung von Funktionen höherer Ordnung existszusammen mit rlikefür das, was Sie benötigen, wie im folgenden Beispiel gezeigt:

val json = """[
    {
        "row_id": 1,
        "data": [
            { "id": "test_111", "sum": "10" },
            { "id": "skip1", "sum": "74" }
        ]
    },
    {
        "row_id": 2,
        "data": [
            { "id": "test_XYZ", "sum": "20" },
            { "id": "skip2", "sum": "85" }
        ]
    },
    {
        "row_id": 3,
        "data": [
            { "id": "skip3", "sum": "96" },
            { "id": "test_2222", "sum": "30" }
        ]
    } 
  ]"""

val df = spark.read.option("multiline", "true").json(Seq(json).toDS)

df.show(false)
/*
+------------------------------+------+
|data                          |row_id|
+------------------------------+------+
|[{test_111, 10}, {skip1, 74}] |1     |
|[{test_XYZ, 20}, {skip2, 85}] |2     |
|[{skip3, 96}, {test_2222, 30}]|3     |
+------------------------------+------+
*/

So filtern Sie den Datenrahmen basierend auf dem Vorhandensein von Datenrahmen data.idmit dem test_[0-9]+Muster:

df.
  where(expr("exists(data, d -> d.id rlike 'test_[0-9]+')")).
  show(false)
/*
+------------------------------+------+
|data                          |row_id|
+------------------------------+------+
|[{test_111, 10}, {skip1, 74}] |1     |
|[{skip3, 96}, {test_2222, 30}]|3     |
+------------------------------+------+
*/


Beantwortet von –
Leo C


Antwort geprüft von –
David Marino (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like