工作需要将一个巨大的10G的json导入mysql数据库。
看到mysql官方有对json导入的支持。
如下:
MySQL :: Import JSON to MySQL made easy with the MySQL Shell
$ mysqlsh root@localhost:33300/test --import /path_to_file/zips.json
Creating a session to 'root@localhost:33300/test'
Please provide the password for 'root@localhost:33300':
Fetching schema names for autocompletion... Press ^C to stop.
Your MySQL connection id is 21 (X protocol)
Server version: 8.0.13 MySQL Community Server - GPL
Default schema `test` accessible through db.
Importing from file "/path_to_file/zips.json" to collection `test`.`zips` in MySQL Server at localhost:33300
.. 29353.. 29353
Processed 3.15 MB in 29353 documents in 1.2058 sec (24.34K documents/s)
Total successfully imported documents 29353 (24.34K documents/s)
但 是存在问题。
导入的一行json是作为一个object存在数据库中,与我们设想的不一样。
这可是官方的例子,我觉得官方对这个问题的理解跟我们是有出入的。
谁会需要这种导入方式呢???
研究了一下也没有更好的结果。
正好navicat有导入json的功能。
在数据库上右键就有导入向导。
但是navicat支持的json是完美格式的json。
整个.json文件是一个json文本
{
{ "text":"abcd", "time":"2023-10-20"},
{ "text":"1234", "time":"2023-10-21"}
}
但是我们的json是按行分割的 json。
每一行是一个完整的json文本
{ "text":"abcd", "time":"2023-10-20"}
{ "text":"1234", "time":"2023-10-21"}
{ "text":"1111", "time":"2023-10-22"}
navicat不识别,会觉得是错的。
所以还要对文本处理一下,每一行末尾添加一个逗号,然后最前面添加"{" ,最后面添加 "}"
由于文本非常大,添加起来也非常耗时。
不过navicat运行起来还是非常快的。
navicat试用到时间了怎么办?
神奇代码来解决。
只对16.2.*版本起作用。
@echo off
set dn=Info
set dn2=ShellFolder
set rp=HKEY_CURRENT_USER\Software\Classes\CLSID
:: reg delete HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPremium\Registration14XCS /f %针对<strong><font color="#FF0000">navicat</font></strong>15%
reg delete HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPremium\Registration16XCS /f
reg delete HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPremium\Update /f
echo finding.....
for /f "tokens=*" %%a in ('reg query "%rp%"') do (
echo %%a
for /f "tokens=*" %%l in ('reg query "%%a" /f "%dn%" /s /e ^|findstr /i "%dn%"') do (
echo deleteing: %%a
reg delete %%a /f
)
for /f "tokens=*" %%l in ('reg query "%%a" /f "%dn2%" /s /e ^|findstr /i "%dn2%"') do (
echo deleteing: %%a
reg delete %%a /f
)
)
echo re trial done!
pause
exit