1.2 去除分類字段的重複值
圖1-1給出了在指令行中執行gzcat chapter01/data/clickstream/clickstream_sample.tsv.gz | less-u所得到的結果。列之間用tab鍵(^i)隔開。讀者可能會注意到,許多值都空缺了,許多現實應用中的大資料集都是這樣。資料的第一列是時間戳,檔案包含了複雜的資料(比如數組(array)、結構(struct),以及映射(map)),這也是大資料集的另一個特征。

圖1-1 使用unix的less-u指令後,clickstream檔案得到的輸出
unix提供了一些工具來分析資料。less、cut、sort和uniq大概是文本進行中最常用的指令行工具。awk、sed、perl和tr可以做更複雜的轉換和提取操作。
幸運的是,scala允許在repl中透明地使用指令行工具來做轉換:
在scala repl環境中,可使用scala.sys.process包來調用熟悉的unix指令。從輸出結果可以立即看到這個網上商店的顧客最關注男鞋和跑步鞋,而且大多數通路者使用的推薦碼(referral code)為kw_0611081618。
讀者可能會奇怪:究竟什麼時候才開始使用複雜的scala類型和算法。其實許多高度優化的工具在scala之前就有了,而且在資料挖掘分析中會更高效。在最初的階段,最大的瓶頸通常隻是磁盤i/o和緩慢的互動性。随後才會去研究更多的疊代算法,它們通常都是記憶體密集型算法。值得注意的是:在現代多核計算機中,隐式地并行執行unix的管道操作,就像在spark中并行執行一樣(後面的章節會介紹)。
對輸入資料使用隐式的或顯式的壓縮,也可以減少i/o時間。 這對具有重複值和稀疏内容的(大多數)半結構化資料集更有效。也可在多核計算機上隐式地并行執行解壓操作,這可以消除計算瓶頸,但在硬體上卻不能并行執行壓縮操作(比如,在ssd上就不能并行壓縮檔案)。推薦使用檔案夾而不是檔案作為資料集的規範(paradigm),這樣插入操作就可簡化為把資料檔案放在檔案夾中。這就是hadoop(比如hive和impala)組織資料的原理。