2017-05-03 16 views
2

我有一個火花SQL問題編號欣賞到從結構的嵌套數組做一個條件選擇最好的方式一定的指導意義。星火SQL - 嵌套數組,條件選擇

我具有低於

```

{ 
    "id":"p1", 
    "externalIds":[ 
     {"system":"a","id":"1"}, 
     {"system":"b","id":"2"}, 
     {"system":"c","id":"3"} 
    ] 
} 

```

示例JSON文檔在火花SQL我想選擇基於該陣列結構中的一個的 「ID」在一些條件邏輯上。

e.g以上,選擇具有「系統」 =「b」的,「2」,即ID數組子元件的ID字段。

如何最好地做到這一點的SparkSQL?

乾杯和謝謝!

+0

除非你'explode'唯一的選擇是UDF,這取決於你使用的語言。 – zero323

+0

感謝,進出口使用斯卡拉 - 我不想爆炸沒有 –

+0

使用Scala你也可以轉換爲靜態類型'Dataset'。或者像上面提到的那樣,使用'udf'。如果你知道這個指數,你也可以使用它,但我認爲你沒有。 – zero323

回答

1

使用的UDF,這可能是這樣的,給定一個數據幀(String類型的所有屬性):

+---+---------------------+ 
|id |externalIds   | 
+---+---------------------+ 
|p1 |[[a,1], [b,2], [c,3]]| 
+---+---------------------+ 

定義的UDF遍歷陣列,並且找到所需的元素:

def getExternal(system: String) = { 
    udf((row: Seq[Row]) => 
    row.map(r => (r.getString(0), r.getString(1))) 
     .find { case (s, _) => s == system} 
     .map(_._2) 
     .orElse(None) 
) 
} 

,並使用它像這樣:

df 
    .withColumn("external",getExternal("b")($"externalIds")) 
    .show(false) 

+---+---------------------+--------+ 
|id |externalIds   |external| 
+---+---------------------+--------+ 
|p1 |[[a,1], [b,2], [c,3]]|2  | 
+---+---------------------+--------+ 
+0

接受,非常感謝。你可以看看這一個了,請[鏈接](http://stackoverflow.com/questions/43963273/spark-dataframe-generate-an-array-of-tuple-from-a-map-type) –