我們之前介紹過的Import_table(importTable)是壹個並行導入各種格式文本的工具,封裝了MySQL語句?加載數據本地文件.
比如導入壹個以TAB為分隔符的文本數據文件:/tmp/sample_ytt.txt?對表:ytt_new.t1,可以執行以下語句:
上面的結果是什麽?在文件中加載數據?語句的導入結果。如果使用import_table方法來做同樣的事情,基於Python語法,使用方法如下:
那麽我們再來看另壹個需求:在導入文本文件時對每壹行進行預處理(比如在導入數據前將r2列的值改為mod(r1,10),r5列的值改為abs(r4-46),這樣可以減少導入後重新處理的時間成本。
這個需求被利用了?在文件中加載數據?語句非常容易實現:(導入時更改r2和r5列的數據,類似於UPDATE語法)
那麽如果要用util.import_table(importTable)來實現上述要求,MySQL 8.0.22之前是沒有辦法的。
隨著MySQL 8.0.22的發布,MySQL對import_table方法進行了擴展,增加了壹個選項“deColumns”,實現了字段的預輸入定制功能,並且可以更加豐富。
接下來,使用import_table實現上述需求,並定制字段r2和r5:
以上選項見下圖:
我來詳細解釋壹下上圖的含義:藍色字體列對應的數組指定了數據文件中的每壹行字段,也就是每壹列的值被默認的制表符分隔符分開,1和2代表占位符,1代表數據文件中每壹行的第壹列,2代表數據文件中每壹行的第四列,decodeColumns字典分別處理需要預先輸入的字段。例如,r1字段保留為變量@1,r2字段對應mod(r1,10)。
如果還是不太明白轉換規則,可以暫時打開通用日誌。上面import_table(importTable)對應的MySQL日誌是:
上面的日誌寫的很清楚,內部轉換成最基本的load data infile語法。
在這裏我簡單解讀了MySQL 8.0.22對MySQL Shell定制輸入文本文件的壹個新特性,更多新特性可以繼續關註。