Spark生產(chǎn)案例分享:Hive分區(qū)表修改字段名后Spark查詢空值?
1.企業(yè)案例背景
? ? ? ?客戶最新產(chǎn)品文檔里要求變更字段名,數(shù)倉開發(fā)小伙伴按照客戶爸爸的要求使用Hive標(biāo)準(zhǔn)語法修改了列名;比如將字段FCD60改為FLN90。
?現(xiàn)象描述:表是分區(qū)ORC表,Spark版本2.4x。
? ? ? 修改歷史有歷史分區(qū)數(shù)據(jù)的表的字段名后,導(dǎo)致spark-sql讀取hive表歷史分區(qū)時(shí),被修改的字段FLN90讀取到的都是null值。但是讀取新的分區(qū)數(shù)據(jù)時(shí),不受影響,被修改的字段值可以正常讀取;
2.問題排查與解決
? ?排查測試,換個(gè)其他格式的表如textfile發(fā)現(xiàn)沒有這種問題。于是查詢spark官網(wǎng),搜索關(guān)于orc表這塊的Jira
? ?發(fā)現(xiàn)是可能是由于spark.sql.hive.convertMetastoreOrc參數(shù)默認(rèn)值的變化造成的,Spark 2.4 以后, Spark將采用自身的 SerDe 而非采用 Hive 的SerDe 處理 Hive 的 ORC 數(shù)據(jù)表(SerDe是Serialize/Deserilize的簡稱,目的是用于序列化和反序列化)
具體源代碼在于: HiveStrategies.scala中 RelationConversions 類中, 可以看到根據(jù)配置不同, 對于 ORC 文件采用兩種不同的處理方式
其中采用 org.apache.spark.sql.execution.datasources.orc.OrcFileFormat 會導(dǎo)致如上問題.
尖叫總結(jié):
在 Spark 2.3 以后, Spark 增加 spark.sql.hive.convertMetastoreOrc 參數(shù), 設(shè)定 ORC 文件使用采用向量化 Reader, 但是會引申由于 Spark SQL 無法與 Hive SQL 采用同一 SerDe 從而對 Parquet/Hive 數(shù)據(jù)表產(chǎn)生處理上的不同, 因此需要限定如下參數(shù)從而讓 Spark 使用 Hive 的SerDe.
?這就是一個(gè)很好的spark生產(chǎn)中遇到的案例,有應(yīng)用場景有解決方案,既體現(xiàn)了你扎實(shí)的spark功底,又體現(xiàn)了你生產(chǎn)中rouble shooting的能力。小白面試時(shí)講講這個(gè)案例,不比你背的八股文更加真實(shí)和加分哈;
