存取 Spark SQL DataFrame 中的複雜資料
Spark SQL 支援複雜的資料類型,例如陣列和映射。 然而,查詢這些需要特定的方法。 本指南詳細介紹如何有效查詢這些結構:
陣列:
有幾種存取陣列元素的方法:
getItem
方法: 此 DataFrame API 方法直接透過索引存取元素。
<code class="language-scala"> df.select($"an_array".getItem(1)).show</code>
Hive 括號語法: 這種類似 SQL 的語法提供了另一種選擇。
<code class="language-sql"> SELECT an_array[1] FROM df</code>
使用者定義函數 (UDF):UDF 為更複雜的陣列操作提供了彈性。
<code class="language-scala"> val get_ith = udf((xs: Seq[Int], i: Int) => Try(xs(i)).toOption) df.select(get_ith($"an_array", lit(1))).show</code>
內建函數: Spark 提供了內建函數,例如 transform
、filter
、aggregate
以及用於陣列處理的 array_*
系列。
地圖:
存取地圖值涉及類似的技術:
getField
方法: 使用鍵檢索值。
<code class="language-scala"> df.select($"a_map".getField("foo")).show</code>
Hive 括號語法: 提供類似 SQL 的方法。
<code class="language-sql"> SELECT a_map['foo'] FROM df</code>
點語法:存取地圖欄位的簡潔方法。
<code class="language-scala"> df.select($"a_map.foo").show</code>
UDF:用於自訂地圖操作。
<code class="language-scala"> val get_field = udf((kvs: Map[String, String], k: String) => kvs.get(k)) df.select(get_field($"a_map", lit("foo"))).show</code>
*`map_functions:** Functions like
map_keysand
map_values` 可用來地圖運算。
結構:
存取結構體欄位非常簡單:
點語法:最直接的方法。
<code class="language-scala"> df.select($"a_struct.x").show</code>
原始 SQL: 使用 SQL 語法的替代方案。
<code class="language-sql"> SELECT a_struct.x FROM df</code>
結構體數組:
查詢巢狀結構需結合以上技術:
巢狀點語法:存取陣列中結構體中的欄位。
<code class="language-scala"> df.select($"an_array_of_structs.foo").show</code>
組合方法: 使用 getItem
存取陣列元素,然後使用點語法存取結構體欄位。
<code class="language-scala"> df.select($"an_array_of_structs.vals".getItem(1).getItem(1)).show</code>
使用者定義型別 (UDT):
UDT 通常使用 UDF 存取。
重要注意事項:
HiveContext
,具體取決於您的 Spark 版本。 *
) 可以與點語法一起使用來選擇多個欄位。 本指南全面概述了在 Spark SQL DataFrame 中查詢複雜資料類型。請記住選擇最適合您的特定需求和資料結構的方法。
以上是如何在 Spark SQL DataFrame 中查詢複雜資料類型(陣列、映射、結構)?的詳細內容。更多資訊請關注PHP中文網其他相關文章!