1. 程式人生 > 資料庫 >Spark SQL操作JSON欄位的小技巧

Spark SQL操作JSON欄位的小技巧

前言

介紹Spark SQL的JSON支援,這是我們在Databricks中開發的一個功能,可以在Spark中更容易查詢和建立JSON資料。隨著網路和移動應用程式的普及,JSON已經成為Web服務API以及長期儲存的常用的交換格式。使用現有的工具,使用者通常會使用複雜的管道來在分析系統中讀取和寫入JSON資料集。在Apache Spark 1.1中釋出Spark SQL的JSON支援,在Apache Spark 1.2中增強,極大地簡化了使用JSON資料的端到端體驗。

很多時候,比如用structure streaming消費kafka資料,預設可能是得到key,value欄位,key是偏移量,value是一個byte陣列。很可能value其實是一個Json字串。這個時候我們該如何用SQL操作這個json裡的東西呢?另外,如果我處理完的資料,我想寫入到kafka,但是我想把整條記錄作為json格式寫入到Kafka,又該怎麼寫這個SQL呢?

get_json_object

第一個就是get_json_object,具體用法如下:

select get_json_object('{"k": "foo","v": 1.0}','$.k') as k

需要給定get_json_object 一個json欄位名(或者字串),然後通過類似jsonPath的方式去拿具體的值。
這個方法其實有點麻煩,如果要提取裡面的是個欄位,我就要寫是個類似的東西,很複雜。

from_json

具體用法如下:

select a.k from (
select from_json('{"k": "foo",'k STRING,v STRING',map("","")) as a
)

這個方法可以給json定義一個Schema,這樣在使用時,就可以直接使用a.k這種方式了,會簡化很多。

to_json

該方法可以把對應欄位轉化為json字串,比如:

select to_json(struct(*)) AS value

可以把所有欄位轉化為json字串,然後表示成value欄位,接著你就可以把value欄位寫入Kafka了。是不是很簡單。

處理具有大量欄位的JSON資料集

JSON資料通常是半結構化、非固定結構的。將來,我們將擴充套件Spark SQL對JSON支援,以處理資料集中的每個物件可能具有相當不同的結構的情況。例如,考慮使用JSON欄位來儲存表示HTTP標頭的鍵/值對的資料集。每個記錄可能會引入新的標題型別,併為每個記錄使用一個不同的列將產生一個非常寬的模式。我們計劃支援自動檢測這種情況,而是使用map型別。因此,每行可以包含Map,使得能夠查詢其鍵/值對。這樣,Spark SQL將處理具有更少結構的JSON資料集,推動了基於SQL的系統可以處理的那種查詢的邊界。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對我們的支援。