将大型JSON数据导入PostgreSQL

时间:2017-08-05 02:39:42

标签: php json database postgresql

NOOB开发者又回来了另一个问题。我正致力于将大型数据集导入PostgreSQL 9.5数据库。我最初开始使用PHP,但是一旦我尝试加载整个14mb文件,它就失败了。我继续增加脚本中的内存限制,但这没有任何帮助。我想过使用解析库,但是我决定使用PostgreSQL 9.5,我应该只使用数据库。我的JSON文件具有可重复的字段,因此我无法使用JSONB并使用普通的JSON导入。不幸的是,直到我尝试加载整个文件才有效。然后我得到以下错误:

ERROR:  invalid input syntax for type json
DETAIL:  Expected JSON value, but found "]".
CONTEXT:  JSON data, line 1: ...:"Commercial & Industrial","u_cost_code":""},"",]

以下是JSON文件内容的示例:

Array
(
    [result] => Array
        (
            [0] => Array
                (
                    [field1] => 0
                    [fiedl2] => 
                    [field3] => 1900-04-19 19:14:10
                    [field4] => false
                    [field5] => XXX.XXXXX.XXX.XXX.XXX
                    [field6] => ldap:CN=XXXX XXXXXXX,OU=XXXXX,OU=XXXXX,OU=XXX,DC=XXXXXX,DC=XXXX,DC=XXXX
                    [field7] => 1900-07-18 17:45:08
                    [field8] => true
                    [field9] => 
                    [field10] => false
                    [field11] => 2
                    [field12] => 30406
                    [field13] => T
                    [field14] => 00000000000000000
                    [field15] => 1900-01-19 21:33:07
                    [field16] => Array
                        (
                            [link] => https://mozilla.com
                            [value] => mozilla
                        )

                    [field17] => 1601-01-01 06:00:00
                    [field18] => 
                    [field19] => false
                    [field20] => 01001
                    [field21] => 

                )           
        )
)

以下是我用来创建表格的声明,这使我能够毫无问题地导入整个文件14mb:

CREATE TABLE temp_json 
(
     ID SERIAL NOT NULL PRIMARY KEY
    ,TIMESTAMP TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    ,VALUES TEXT
);

我开始关注此开发人员希望解决此问题的示例:how-to-get-json-data-type-into-postgresql

以下是我用来将数据导入表中的相当标准的复制命令:

copy temp_json(values) from 'C:\path\to\my\json_file.json';

然后我继续使用以下sql语句尝试将数据移动到我在此处找到的关系表loading-json-data-from-a-file-into-postgres,在堆栈上。我这样做是为了找到一种更简单的方法将数据集移动到表中。这是我想要工作的sql语句:

insert into table_to_hold_json 
select 
values::json->'result'->'calendar_integration' as calendar_integration,
values::json->'result'->'country' as country,
values::json->'result'->'last_login_time' as last_login_time,
values::json->'result'->'u_gartner_acct' as u_gartner_acct,
values::json->'result'->'u_dept_name' as u_dept_name,
values::json->'result'->'source' as source,
values::json->'result'->'sys_updated_on' as sys_updated_on,
values::json->'result'->'u_field_user' as u_field_user
from ( select json_array_elements(replace(values,'\','\\')::json) as values 
from temp_json ) a;

但是,我现在得到的错误与导入temp_json表时的错误相同。我也试图逃避' \'使用复制命令:

csv quote e'\x01' delimiter e'\x02'

不幸的是,当我尝试查询JSON数据时,我仍然遇到同样的错误。所以,现在我正试图弄清楚如何逃脱这种愚蠢的行为。非常感谢给予的任何帮助!

1 个答案:

答案 0 :(得分:0)

好的,所以我回过头来找出如何从数据提供商处分解我的文件下载。现在我将数据集保持在指定的超时时间内,我可以使用PHP或其他任何我想解析数据的方法。这是一个很好的提醒,总是仔细检查您的日志或数据集。 : - )