hive中自定義RegexSerDe嘗試

2021-09-01 16:19:41 字數 987 閱讀 4123

當原始資料中包好了諸如'\u0001'、'\u0002'、'\u0003'等hive預設的column分隔字元時,在select資料時就可能出現資料格式錯亂的情況,為了避免這類現象,可以用自定義的regexserde規避這類特殊字元。

例子:ac18148213512592717614403|1351259272977|0.44|ulc|302|302^r670777442^rlbx001442114792309^r670777442^r2^r2??a±à??=kj-0005,?ò?ònickangning^r^r^r^rip^a^rumid^a^rbuyernick^awnwangning^rstorecode^akj-0005 

對於這樣的例子,如果嘗試在建立hive表時存在如下指定:

row format

serde 'org.apache.hadoop.hive.contrib.serde2.regexserde'

with serdeproperties

( "input.regex" = "(.*)\\|(.*)\\|(.*)\\|(.*)\\|(.*)\\|(.*$)",

"output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s")

然後在載入資料後做select時就會發現展現出來的最後一列在「ip」後面沒有了。

通過檢驗發現regexserde按指定的正則切分完全正確,但hive在組裝返回結果時會根據特殊字元(^a,^b,^c三種)做「二次切分」,因為例子中「ip」後面恰好有個^a所以被截斷了,又因為"ip"所在的列是表的最後一列,所以"ip"後面的內容被直接丟掉了,否則會錯位到表的下一列。

for (int c = 0; c < numcolumns; c++) else

} catch (runtimeexception e)

row.set(c, null);}}

然後打包上傳,執行hive sql時載入jar路徑和指定自定義的regexserde,問題得以解決。

Hive 中自定義UDF函式

在hive中,編寫自定義udf函式,可以幫助我們更輕鬆的做etl。例如,現在我要求某一列資料的平方,在eclipse新建工程,並新建乙個test包,在test包下新建乙個類square public class square extends udf 然後將 打成jar包,如 test01.jar。然...

hive自定義函式

1.建立類,繼承udf package com.hivedemo.udf import org.apache.hadoop.hive.ql.exec.description import org.apache.hadoop.hive.ql.exec.udf 自定義hive函式 description...

Hive 自定義函式

返回 所有自帶的函式 show functions 返回對該函式的解釋 desc function spilt 返回對該函式的使用例子 desc function extended split1.udf user defined function datediff,date format 等函式 一...