【大數(shù)據(jù)】beeline 導(dǎo)出文件有特殊字符的問題解決
問題
近期在做大數(shù)據(jù)查詢引擎導(dǎo)出文件的功能,使用了 hive 的 beeline 客戶端。發(fā)現(xiàn) beeline 導(dǎo)出的文件以及終端輸出有許多特殊字符。
按照官方文檔使用 beeline 導(dǎo)出命令:[1]
/usr/bin/beeline --silent=true --showHeader=true --outputformat=csv2 -f query.hql </dev/null > /tmp/output.csv 2> /tmp/error.log
現(xiàn)象
在 vim 中顯示為 ^M,在熟悉換行符的背景下,立即認(rèn)出這就是 CR符號(hào),也就是 \n
或者在excel文件頭部,有很多 null,空格等符號(hào)。
分析
在做系統(tǒng)集成的時(shí)候,明顯是不需要用 nohup的,因此沒有采用文檔中的寫法,因?yàn)?nohup 一般直接在終端中使用;另外程序調(diào)用需要前臺(tái)運(yùn)行,等待結(jié)束后,獲得exitCode,以及導(dǎo)出的文件和錯(cuò)誤輸出。
相關(guān)資料
另一位網(wǎng)友也遇到了這個(gè)問題[2],文章中分析了源碼層面,可惜未給出合適的解決辦法,但有啟發(fā)。
過程
由前面的文檔啟發(fā),觀察 /bin/hive 腳本, 發(fā)現(xiàn)
if [[ "$SERVICE" =~ ^(hiveserver2|beeline|cli)$ ]] ; then
# If process is backgrounded, don't change terminal settings
if [[ ( ! $(ps -o stat= -p $$) =~ "+" ) && ! ( -p /dev/stdin ) && ( ! $(ps -o tty= -p $$) =~ "?" ) ]]; then
export HADOOP_CLIENT_OPTS="$HADOOP_CLIENT_OPTS -Djline.terminal=jline.UnsupportedTerminal"
fi
fi
在有使用過 Alibaba Cloud Toolkit 的背景下,立即發(fā)現(xiàn)這是一個(gè) stty size 的問題。
解決
在程序調(diào)用的場(chǎng)景下,通過/bin/bash 進(jìn)行調(diào)用,所以其實(shí)是以一個(gè)終端環(huán)境,終端就涉及到美化輸出的問題
所以一定要設(shè)置終端類型為不支持終端,因此顯式設(shè)置變量:
HADOOP_CLIENT_OPTS="-Djline.terminal=jline.UnsupportedTerminal"
ProcessBuilder _proc = new ProcessBuilder().inheritIO().command(arguments);
_proc.environment().put("HADOOP_CLIENT_OPTS","-Djline.terminal=jline.UnsupportedTerminal");
Process proc = _proc.start();
建議
一般導(dǎo)出的文件是UTF-8,對(duì)于Windows的用戶來說,直接打開到Excel中文會(huì)亂碼,最好添加上 BOM[3]。
一般添加的是EF BB BF

浙公網(wǎng)安備 33010602011771號(hào)