Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как выдернуть часть JSON? / 15 сообщений из 15, страница 1 из 1
28.03.2017, 20:23
    #39428747
Oracloidesche
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выдернуть часть JSON?
Нужна консультация

Есть большой JSON в CLOB:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
{
  "key1": "value1",
  "key2": "value2",
  "data": {
    "dt": "2017-01-01T00:00:00",
    "super_big_array": [ 
    .... тут огромное кол-во объектов, мегабайт на 100 ...
    ]
  }
}



Вот как мне выдернуть в другой clob то, что лежит в data?
т.е. чтобы там получилось

Код: javascript
1.
2.
3.
4.
5.
6.
{
    "dt": "2017-01-01T00:00:00",
    "super_big_array": [ 
    .... тут огромное кол-во объектов, мегабайт на 100 ...
    ]
}



Мне в голову приходит только поискать в начале "data": , и в конце какой-нибудь последовательности символов...
В поддержке json, которая появилась в 12с нет ничего чтобы выдернуть это более высокоуровневыми средствами? Другие варианты тоже выслушаю если есть.

Спасибо.
...
Рейтинг: 0 / 0
28.03.2017, 22:20
    #39428809
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выдернуть часть JSON?
Oracloidesche
Код: javascript
1.
2.
    "super_big_array": [ 
    .... тут огромное кол-во объектов, мегабайт на 100 ...

Обратно пропорциональное количеству мозгов архитектора?
...
Рейтинг: 0 / 0
29.03.2017, 09:22
    #39428937
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выдернуть часть JSON?
OracloidescheВ поддержке json, которая появилась в 12с нет ничего чтобы выдернуть это более высокоуровневыми средствами?Попробуй API for JSON Processing .

Средствами SQL не выйдет (если не влезает в varchar) даже если обратиться "поэлементно" и обернуть враппером.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
drop table tj;

create table tj (id int, value clob, constraint check_json check(value is json));

insert into tj
select
rownum,
'{
  "key1": "value1",
  "key2": "value2",
  "data": {
    "dt": "2017-01-01T00:00:00",
    "super_big_array": [ 
    {
    "aaa": 111, "bbb": 222,
    "yyy": 666, "zzz": 777   
    }
    ]
  }
}'
from dual
connect by rownum <= 4;

update tj t
   set value = regexp_replace(t.value,
                              '(\d)(\1{2})',
                              '"\1\2' || lpad('x', power(10, rownum), 'x') || '"')
 where id > 1;

commit;


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
SQL> set lines 160 pages 160
SQL> column aaa format a35
SQL> column aaa_ format a35
SQL> column arr1 format a35
SQL> column arr2 format a35
SQL> select json_query("T"."VALUE" format json,
  2                    '$.data.super_big_array.aaa' asis) aaa,
  3         json_query("T"."VALUE" format json,
  4                    '$.data.super_big_array.aaa' with conditional array
  5                    wrapper error on error) aaa_,
  6         json_query("T"."VALUE" format json,
  7                    '$.data.super_big_array[*]' asis with array wrapper) arr1,
  8         json_query("T"."VALUE" format json, '$.data.super_big_array' asis) arr2
  9    from tj t;

AAA                                 AAA_                                ARR1                             ARR2
----------------------------------- ----------------------------------- ----------------------------------- -----------------------------------
111                                 [111]                               [{"aaa":111,"bbb":222,"yyy":666,"zz [{"aaa":111,"bbb":222,"yyy":666,"zz
                                                                        z":777}]                            z":777}]

111xxxxxxxxxx                       ["111xxxxxxxxxx"]                   [{"aaa":"111xxxxxxxxxx","bbb":"222x [{"aaa":"111xxxxxxxxxx","bbb":"222x
                                                                        xxxxxxxxx","yyy":"666xxxxxxxxxx","z xxxxxxxxx","yyy":"666xxxxxxxxxx","z
                                                                        zz":"777xxxxxxxxxx"}]               zz":"777xxxxxxxxxx"}]

111xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ["111xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx [{"aaa":"111xxxxxxxxxxxxxxxxxxxxxxx [{"aaa":"111xxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                                    "]                                  xxxxxxx","bbb":"222xxxxxxxxxxxxxxxx xxxxxxx","bbb":"222xxxxxxxxxxxxxxxx
                                                                        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                                                                        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                                                                        xxxxxxxxxxxxxx","yyy":"666xxxxxxxxx xxxxxxxxxxxxxx","yyy":"666xxxxxxxxx
                                                                        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                                                                        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                                                                        xxxxxxxxxxxxxxxxxxxxx","zzz":"777xx xxxxxxxxxxxxxxxxxxxxx","zzz":"777xx
                                                                        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                                                                        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                                                                        xxxxxxxxxxxxxxxxxxxxxxxxxxxx"}]     xxxxxxxxxxxxxxxxxxxxxxxxxxxx"}]

111xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ["111xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx             xxxxxxxxxxxxxxxxxxxxxxxxx"]


SQL>

ElicOracloidesche
Код: javascript
1.
2.
    "super_big_array": [ 
    .... тут огромное кол-во объектов, мегабайт на 100 ...

Обратно пропорциональное количеству мозгов архитектора?Почему?

По-моему главная ошибка это опираться на сырую встроенную реализацию, т.к.
во-первых Оракл пока не поддерживает создание json, а только парсинг,
во-вторых при парсинге токен может быть только типа varchar2.

Или если кто-то использует, скажем, XML, а не json на 100 метров, то это тоже значит отсутствие мозгов?
...
Рейтинг: 0 / 0
29.03.2017, 09:26
    #39428943
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выдернуть часть JSON?
dbms_photoshopИли если кто-то использует, скажем, XML, а не json на 100 метров, то это тоже значит отсутствие мозгов?Да. Это неподходящие форматы для таких объёмов.
...
Рейтинг: 0 / 0
29.03.2017, 09:49
    #39428956
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выдернуть часть JSON?
Elicdbms_photoshopИли если кто-то использует, скажем, XML, а не json на 100 метров, то это тоже значит отсутствие мозгов?Да. Это неподходящие форматы для таких объёмов.Для хранения в Оракле не подходящие
По двум причинам, средства Оракла не блещут при работе с большими XML (и тем более json) и по ряду причин данные лучше хранить в реляционном виде.

А для взаимодействия между системами, почему нет.
xml/json позволяют иметь nested данные, что может в разы уменьшить объем в сравнении с плоским cvs, например.
Да и вообще в ряде приложений - это стандарты для обмена данными.
И если ТС, скажем, получает некоторый json через API, то перед ним вполне может стоять описанная задача.

PS. В hadoop, например, разработчик волен выбирать в каком формате хранятся данные путем указания SerDe
и имеется встроенный парсер для json, так что желающие могут хранить терабайты джейсонов и не испытывать особых проблем.
...
Рейтинг: 0 / 0
29.03.2017, 09:56
    #39428962
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выдернуть часть JSON?
dbms_photoshopДа и вообще в ряде приложений - это стандарты для обмена данными.Нормальное API даст piecewise интерфейс.
Здравым смыслом был бы потоковый формат из xml/json-чиков.
...
Рейтинг: 0 / 0
29.03.2017, 10:42
    #39429007
Oracloidesche
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выдернуть часть JSON?
Да, это интеграция с внешней системой. Сами пытались до них донести, что это плохая идея, но все же считают себя самыми умными. Прикол еще в том, что от этой data делается подпись sha3-512 и мы эту подпись проверить должны :)
...
Рейтинг: 0 / 0
29.03.2017, 10:49
    #39429013
Oracloidesche
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выдернуть часть JSON?
dbms_photoshop,

То что на Java можно спокойно распарсить такие объемы - понятно, я таким уже занимался, просто не хочется переносить логику в Java, но видимо придется
...
Рейтинг: 0 / 0
29.03.2017, 11:11
    #39429030
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выдернуть часть JSON?
Elicdbms_photoshopДа и вообще в ряде приложений - это стандарты для обмена данными.Нормальное API даст piecewise интерфейс.
Здравым смыслом был бы потоковый формат из xml/json-чиков.Во-первых, в некоторых системах есть такое понятие как порция данных, которую получатель потребляет at one go.
Во-вторых, если в порции передается миллионы трейдов, например, то весьма сомнительно что дергать интерфейс миллионы раз целесообразнее.
...
Рейтинг: 0 / 0
29.03.2017, 11:14
    #39429035
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выдернуть часть JSON?
Oracloideschedbms_photoshop,

То что на Java можно спокойно распарсить такие объемы - понятно, я таким уже занимался, просто не хочется переносить логику в Java, но видимо придетсяНа самом деле ты должен быть благодарен, что сразу напоролся на что-то подобное.
Ибо в случае с XML ты мог бы написать обработку в базе и все хорошо работало бы до поры до времени,
но потом при увеличении объемов в два раза какие-то части системы замедлились в 10 раз,
а на каких-то стали валиться разнообразные internal errors и появилась бы задача все переписывать с нуля.
...
Рейтинг: 0 / 0
29.03.2017, 11:17
    #39429039
Oracloidesche
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выдернуть часть JSON?
dbms_photoshop,

Ну так, не первый день с Ораклом, сразу решил проработать узкие места, до того как все написать :)
...
Рейтинг: 0 / 0
29.03.2017, 23:03
    #39429597
ora601
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выдернуть часть JSON?
Oracloidesche,

Если элемент в "super_big_array" не превышает 4к, то вполне возможно вытащить их все как rows обычным запросом.


Код: plsql
1.
2.
3.
4.
5.
 SELECT jt."big_arr_elem"
  FROM tj,
       json_table(value, '$.data.super_big_array[*]' 
         COLUMNS ("big_arr_elem" VARCHAR2 
                  PATH '$')) AS jt ;
...
Рейтинг: 0 / 0
29.03.2017, 23:24
    #39429601
Shtock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выдернуть часть JSON?
>>во-первых Оракл пока не поддерживает создание json, а только парсинг,

12.2 протестует!
...
Рейтинг: 0 / 0
30.03.2017, 09:45
    #39429736
Shtock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выдернуть часть JSON?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
with jdata as (
select '{
  "key1": "value1",
  "key2": "value2",
  "data": {
    "dt": "2017-01-01T00:00:00",
    "super_big_array": [ 
    1,2,365,9
    ]
  }
}' js
from dual
)
 SELECT  '{
    "dt": "2017-01-01T00:00:00",
    "super_big_array": [' || RTRIM(XMLAGG(XMLELEMENT(E,jt."big_arr_elem",',').EXTRACT('//text()') ).GetClobVal(),',') || ']
}'AS cl
  FROM jdata,
       json_table(js, '$.data.super_big_array[*]' 
         COLUMNS ("big_arr_elem" VARCHAR2 
                  PATH '$')) AS jt ;
...
Рейтинг: 0 / 0
30.03.2017, 19:04
    #39430415
Oracloidesche
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выдернуть часть JSON?
Shtock,

Не, мне потом от этого хэш считать, а это значит, что я не могу соврать ни в одном байте от первоначальной json строки.

Да ладно, я уже наваял на Java через Jackson Streaming API, там можно выдернуть подстроку от и до конкретного байта ну и Streaming API не будет жрать память.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как выдернуть часть JSON? / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]