【问题标题】:Large JSON data import into PostgreSQL大型 JSON 数据导入 PostgreSQL
【发布时间】:2017-08-05 02:39:42
【问题描述】:

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 数据时,我仍然会遇到同样的错误。所以,现在我正用头撞墙,试图弄清楚如何逃离那个该死的']'。非常感谢您提供的任何帮助!

【问题讨论】:

  • 我不认为问题真的出在数组括号上,,] 它前面的逗号,null] 特别是如果那个括号有一个左括号["value", ... ,] 因为有人会解析它@ 987654332@ 会触发解析器期待下一个字符串,但它会遇到 ] Expected JSON value, but found "]" 对我来说,这并不意味着括号不好,而是缺少一个值。只是我的 2 美分。
  • 刚刚让我想到用 PHP 编写 Json 解析器,哈哈,我刚刚写了一个字符串 Lexer\Parser(主要用于 HTML),但也用于其他事情。一个快速的hackish解决方案是删除出现在,]旁边的逗号,并将其替换为,""]]
  • @ArtisticPhoenix 感谢您回答我的问题。我不认为这是问题的一部分。我目前正在尝试解决如何做到这一点,因为我无法更改文件的形成方式。我将不得不把它交给我。
  • 这就是我没有提交答案的原因,除非您可以更改文件,否则处理它的方式会很困难。您可以尝试事先编辑文件,因为 ,] 并不常见,以至于它会成为数据的一部分。
  • 就我个人而言,如果是我,我会构建一个包含该错误的小测试文件,只有几行,{ .. data .. [ ..data.. ,]} 尝试解析它,看看是否是问题所在,然后看看是否简单地搜索和替换它会修复无效的 JSON。预处理文件始终是一种选择,不是最好的性能,但它可以工作,特别是在一次性交易类型的问题上。那么性能就不是那么重要了。

标签: php json database postgresql


【解决方案1】:

好的,所以我回去研究了如何分解从数据提供者下载的文件。现在我将数据集保持在指定的超时期限内,我可以使用 PHP 或其他任何我想要解析数据的东西。这是一个很好的提醒,要始终密切检查您的日志或数据集。 :-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多