Имя: Пароль:
1C
1С v8
Кто-нибудь работает с google BigQuery? Нужен пример загрузки данных в таблицу
, , , , ,
0 zyto
 
16.08.16
14:46
Кто-нибудь использует загрузку в BigQuery из 1С?
У меня получилось:
1. авторизоваться
2. попользовать любые методы получения данных - список таблиц, датасетов и т.д.
3. теоретически могу добавить данные в таблицу по одной строке

но никак не пойму как загрузить несколько строк сразу, одним запросом.
Не понимаю какая должна быть структура в теле запроса.
(CSV / JSON - не важно, их я сформирую, что ещё нужно передавать помимо самих данных и в каком формате?)

Мож кто поделится примерчиком?
1 Кирпич
 
16.08.16
14:52
Щас узнаю, что это такое и напишу. Подожди.
2 Кирпич
 
16.08.16
14:57
вот это что ли? Loading CSV files?
https://cloud.google.com/bigquery/loading-data
3 Serginio1
 
16.08.16
14:59
4 Кирпич
 
16.08.16
15:03
(3) да ему, видимо, на 1С нужен пример
5 zyto
 
16.08.16
15:04
(2)Да, и даже вот так:
https://cloud.google.com/bigquery/loading-data-post-request#examples

Но там есть пара непонятных моментов:
1. 'fields': json.load(open(schema_path, 'r'))
Что они передают в качестве schema_path и что получается в результате выполнения функции load - непонятно
2. они используют метод MediaFileUpload(
            data_path,
            mimetype='application/octet-stream'))
Который явно недоступен в 1Ске, возможно надо данные передать текстом прям в теле запроса, но не понимаю в каком формате

(3)это я всё умею, там загрузка в таблицу по одной строке + используются доп. библиотеки для .net, которые вряд-ли удастся использовать с 1С
6 zyto
 
16.08.16
15:06
+(5)а грузить по одной строке - это значит на каждую строку отдельный HTTP запрос, таблица в какие-то жалкие сотню тысяч строк положит сетку :)
Ну или будет грузится вечно...
7 Serginio1
 
16.08.16
15:07
8 Кирпич
 
16.08.16
15:07
(5) а там же чего то про commandline написано еще. может не париться и пользоваться ей?
9 Serginio1
 
16.08.16
15:09
Там заполнются строки на стороне клиента, а на сервер отправляются скопом

var r = new TableDataInsertAllRequest.RowsData();
r.InsertId = "RowOne";
r.Json = new Dictionary<string, object="">();
r.Json.Add("id", "ID1");
r.Json.Add("Created",
    DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture));
d.Rows.Add(r);

r = new TableDataInsertAllRequest.RowsData();
r.InsertId = "RowTwo";
r.Json = new Dictionary<string, object="">();
r.Json.Add("id", "ID2");
r.Json.Add("Created",
    DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture));
d.Rows.Add(r);

var requestResponse = service.Tabledata.InsertAll(d, ProjectID, DataSet, TableName).Execute();
10 zyto
 
16.08.16
15:12
(8)там надо всякие google SDK ставить, и это работа через костыли.
Хотелось бы напрямую через HTTP (CSV или JSON - не важно), без использования внешних компонент.

(7)я так не умею :)
11 Serginio1
 
16.08.16
15:12
При этом библиотека используе NetStandart3 и можешь использовать хоть на линуксе

https://habrahabr.ru/post/304542/
https://habrahabr.ru/post/307188/
https://habrahabr.ru/post/307360/
12 Serginio1
 
16.08.16
15:14
(10) Все когда то бывает впервые. Ну если не получится через HTTP  имей ввиду.
13 Кирпич
 
16.08.16
15:16
(10) ну можно через node.js еще попробовать.
14 zyto
 
16.08.16
15:16
Да должно получится через HTTP, нужно только определиться со структурой данных.
Там по сути 2 место где могут быть параметры - заголовки и тело запроса.
С заголовками более-менее понятно, не понятно что в тело передавать.
Просто таблицу недостаточно, т.к. в параметрах запроса нет указания в какую таблицу и датасет мы закачиваем данные, соответсвенно надо как-то эти параметры передать в теле запроса...
15 Кирпич
 
16.08.16
15:17
+(13) если это у вас не считается внешней компонентой

(14) сниффером можно посмотреть чего передается.
16 zyto
 
16.08.16
15:19
что бы смотреть сниффером нужен рабочий пример и рабочий сниффер :)
17 Кирпич
 
16.08.16
15:21
(16) рабочий пример node.js
рабочий сниффер в интернете
18 Serginio1
 
16.08.16
15:23
Бери примеры https://developers.google.com/api-client-library/dotnet/get_started
и смотри фиддлером
19 zyto
 
16.08.16
15:35
Ребята, спасибо за помощь, но вы отвечаете на свой вопрос и предлагаете использовать костыли вместо нормального решения.

Если всё-таки кто-то пользуется BigQuery - покажите, что вы передаёте в теле запроса.
20 Кирпич
 
16.08.16
15:41
(19) какие нафиг костыли? тебе предлагают посмотреть сниффером.
"Если всё-таки кто-то пользуется BigQuery" да никто им не пользуется. сто лет он кому нужен.
21 zyto
 
16.08.16
15:46
Кажется (9) был прав, таким образом:
https://cloud.google.com/bigquery/docs/reference/v2/tabledata/insertAll

можно передать сразу несколько строк...
Похоже это то что нужно, сейчас буду пробовать без снифферов и куртизанок :)
22 zyto
 
16.08.16
16:34
Хм... Странная фигня, запрос выполняется, ошибок нет, а данные в таблице не появляются
23 zyto
 
18.08.16
11:32
На всякий случай, для потомков, тело сообщения должно быть примерно таким:
{"rows":
    [{"json":{
        "field1":"aaa",
        "field2":"bbb"}
        },
    {"json":{
        "field1":"ccc",
        "field2":"eee"}
        }
    ]
}

где field1 и field2 - это имена (айдишники) полей в созданной таблице, ну а проект, датасет и имя таблицы мы передаём в URLе.

PS Данные появляются в таблице сразу после выгрузки, но Preview их не показывает (показывает через несколько часов). Что бы посмотреть все данные нужно делать запрос...
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан