背景
這一篇能夠說是「Hive JSON數據處理的一點探索」的兄弟篇。
平臺爲了加速即席查詢的分析效率,在咱們的Hadoop集羣上安裝部署了Spark Server,而且與咱們的Hive數據倉庫共享元數據。也就是說,咱們的用戶便可以經過HiveServer2使用Hive SQL執行MapReduce分析數據,也可使用SparkServer使用Spark SQL(Hive SQL)執行Spark Application分析數據。
二者除去MapReduce和Spark Application計算模式的不一樣以外,Spark Server的優點在於它的Container進程是常駐的,也就是說它的計算資源是預留的,接收到SQL語句以後能夠當即執行,響應速度更加迅速。
既然Spark Server和HiveServer2共享元數據,咱們應該可以在SQL層面最大限度地屏蔽二者之間的差別。雖然Spark官方聲稱兼容大多數Hive SQL語句,但實際使用當中卻常常出現各類異常。
本文所要討論的就是Spark SQL使用Hive內建函數json_tuple的異常問題。
咱們仍是借用「Hive JSON數據處理的一點探索」中的示例數據表來講明問題。
(1)經過HiveServer2來執行Hive SQL語句;
(2)經過Spark Server來執行Hive SQL語句;
終端異常信息爲:Error: java.lang.ClassNotFoundException: json_tuple (state=,code=0)
Spark Server日誌輸出爲:
懷疑的問題爲找不到相應的jar包,其實實際問題是UDF解析類名錯誤,json_tuple爲函數名稱,其對應的類名應爲org.apache.hadoop.hive.ql.udf.generic.GenericUDTFJSONTuple。
這個異常直接影響到咱們使用Hive UDF json_tuple經過Spark Server分析JSON數據。
方案
爲了達到「Hive JSON數據處理的一點探索」中數據表myjson最後的查詢效果,咱們須要使用Hive UDF get_json_object來實現,以下:
由get_tuple和func.json_array結合使用的方案變爲get_json_object和func.json_array結合使用的方案。能夠看出這種方案雖然繁雜,但能夠應對實際問題。