21

Re: Кодування файлу

Якщо використовувати цей код на amazon linux
https://replace.org.ua/post/154291/#p154291
то в файл записується вміст однією стрічкою. Я вже застосував split плюс додавання "\n" в кінці кожної стрічки, потестував на малому файлі. Тепер тестую гігантський файл...

22

Re: Кодування файлу

Як саме ви визначаєте, що "в файл записується вміст однією стрічкою" (мабуть, тут все ж таки ви мали на увазі "рядком")?

23 Востаннє редагувалося frz (01.03.2021 19:16:57)

Re: Кодування файлу

Гігантський файл csv з даними прод містить комірки з декількома рядками.

Наприклад:

t1, t2, t3
123,234,456
              567
              678

де

456
567
678

це значення однієї комірки.

24 Востаннє редагувалося frz (01.03.2021 19:06:04)

Re: Кодування файлу

Працює якщо зберегти csv не в значення, а в файл.

В файл з snowflake коректно формується в мене лише на інстансі Google Cloud, на жаль я не можу заглянути там у внутрощі щоб зрозуміти що саме там використовується замість mod_wsgi, бо деплой там виконується на інстанс на якому в мене нема безпосереднього доступу до файлової системи

відповідна тема про mod_wsgi

Однак інстанс Google Cloud не можу використовувати через обмежену оперативну пам'ять на free tier (гігантські файли не формуються). А купувати платний інстанс менеджмент вирішив Amazon ec2 а не Google Cloud.

Зараз знайду що саме повертає mod_wsgi на ec2 при спробі звернутися до snowflake...

25

Re: Кодування файлу

frz написав:

Рядком, стрічкою... - не бачу різниці в цих термінах.

Рядок (англ. line) - набір символів, обмежений символами нового рядка (\n чи іноді \r\n). Наприклад, рядок коду.
Стрічка (англ. string) - неформальна назва типу даних - низки символів, серед яких може бути кілька символів нового рядка (а може й не бути). Формальна назва - знову ж таки рядок, але так виходить не плутатися. Multiline string - це багаторядкова стрічка, тобто стрічка з кількох рядків.

frz написав:

файл csv з даними прод містить комірки з декількома рядками

Значить, доведеться формувати на клієнті щось інше, а не csv (comma serparated values = дані, розділені комами). JSON ніяк не вийде?

26

Re: Кодування файлу

Глянув в коректно сформований файл csv на google cloud - такі мультирядкові значення формуються в подвійних лапках, наприклад:

"456
567
678"

27

Re: Кодування файлу

JSON ніяк не вийде?

Для JSON потрібно щоб значення були одного типу. Або я поки що не розібрався ще як це зробити.

28

Re: Кодування файлу

frz написав:

Зараз знайду що саме повертає mod_wsgi на ec2 при спробі звернутися до snowflake...

https://replace.org.ua/post/154313/#p154313

29

Re: Кодування файлу

Якщо вам потрібно багато пам'яті для обробки файлів - то або файли якісь специфічні, або ви щось не так робите - скажімо, намагаєтеся сформувати вміст файлу у пам'яті повністю перед перекиданням до файлу.

Подякували: leofun011

30

Re: Кодування файлу

2) Клієнт передає дані через API запитом POST де в тілі запиту - змінна з даними.

уточніть - дані приходять у вигляді бінарного файла чи стрічки в форматі json?
який Content-Type - application/json or application/octet-stream?

p.s.
як на мене - краще користуватися менеджером контексту, як і запропоновано у прикладі , що надав пан koala.
https://book.pythontips.com/en/latest/c … agers.html

Подякували: leofun011

31

Re: Кодування файлу

Файли просто гігантські. Так, я вже навчився витягувати дані з Snowflake батчами і зберігати в файл в циклі поки остання відповідь не буде порожньою. Проблема виникає на наступному етапі, коли я отримую готовий файл з Google Cloud на інстанс ec2.
Щоб уникнути такої проблеми, потрібно всі дії виконувати на одному інстансі. На ec2 стикнувся з неробочою зв'язкою apache + mod_wsgi + snowflake_python_connector. Так як на Google Cloud snowflake_python_connector працює, то зараз буду пробувати відтворити тамтешнє середовище -- nginx + uWSGI. Оскільки досі ніколи не стикався з nginx, то це буде трохи челендж.

32 Востаннє редагувалося frz (01.03.2021 22:33:06)

Re: Кодування файлу

ping написав:

2) Клієнт передає дані через API запитом POST де в тілі запиту - змінна з даними.

уточніть - дані приходять у вигляді бінарного файла чи стрічки в форматі json?

Дані приходять у вигляді текстового файлу, де сепаратор між значеннями - в залежності від налаштувань на клієнті - кома або крапка з комою або двокрапка або ж таб.

який Content-Type - application/json or application/octet-stream?

Мабуть той що присвоюється за замовчуванням? Бо в мене в коді це ніде не вказано.

requests.post(url = URL, data = str(snowflake_response).encode('utf-8'))

p.s.
як на мене - краще користуватися менеджером контексту, як і запропоновано у прикладі , що надав пан koala.
https://book.pythontips.com/en/latest/c … agers.html

Можливо, однак чим саме це мені допоможе, якщо наприклад зараз стикнувся з потребою зберігати на клієнті мультистрічкове значення в подвійні лапки... https://replace.org.ua/post/154311/#p154311

----

Upd:

стикнувся з потребою зберігати на клієнті мультистрічкове значення в подвійні лапки

Поки що бачу лише варіант - сплітити на клієнті весь файл і вставляти кожне значення в подвійні лапки... Хіба що знайду можливість на клієнті (Databricks) зберігати файли у файловій системі, а не в змінній.

33

Re: Кодування файлу

frz написав:
ping написав:

2) Клієнт передає дані через API запитом POST де в тілі запиту - змінна з даними.

уточніть - дані приходять у вигляді бінарного файла чи стрічки в форматі json?

Дані приходять у вигляді текстового файлу, де сепаратор між значеннями - в залежності від налаштувань на клієнті - кома або крапка з комою або двокрапка або ж таб.

якщо дані приходять файлом - значить  у бінарному вигляді (навіть якщо це текстовий файл)
якщо я вірно зрозумів - їх не треба обробляти - просто записати кудись.
тоді найкраще рішення - прийняти бінарний об'єкт і записати бінарний об'єкт.
без будь якої обробки - типу перекодування, перетворення в стрічки, сплітування, тощо.
це і швидше і дозволить уникнути проблеми з різними локалями/кодовими_таблицями


який Content-Type - application/json or application/octet-stream?

Мабуть той що присвоюється за замовчуванням? Бо в мене в коді це ніде не вказано.

requests.post(url = URL, data = str(snowflake_response).encode('utf-8'))

якщо це Ваш код - то Ви і задаєте всі параметри.
якщо Ви лише приймаєте запит на стороні АПІ - подивіться прийнятий об'єкт request - там точно мусить бути вся інформація про оотриманий запит, в т.ч. який Content-Type

також в наведеному коді видно перекодування
а який тип даних 'snowflake_response' ?
якщо це бінарний об'єкт - чи не простіше його НЕ МОДИФІКУЮЧИ передавати на АПІ таким самим бінарним об'єктом?

34 Востаннє редагувалося frz (01.03.2021 23:53:08)

Re: Кодування файлу

якщо це Ваш код - то Ви і задаєте всі параметри

Майже так. Точніше, оскільки це мій код, то я би міг задати всі параметри, якби знав які.


а який тип даних 'snowflake_response' ?

<class 'str'>


НЕ МОДИФІКУЮЧИ передавати на АПІ

Зовсім не модифікуючи не вийде, бо отримую помилку ще на клієнті:

'latin-1' codec can't encode character '\u2013' in position 5635: Body ('–') is not valid Latin-1. Use body.encode('utf-8') if you want to send it encoded in UTF-8.

Upd: Отже, мінімальна модифікація body.encode('utf-8') необхідна. При цьому перенесення значень в рамках однієї "екселівської" комірки все одно не враховується.
Повинно бути:

"abc
def"

а виходить:

abc
def

І це зберігання даних "як є" лише з перекодуванням utf-8.

Дуже дивно, однак на інстансі Google Cloud із nginx + (швидше за все) uWSGI такої проблеми нема. Пробую копати в бік nginx.

35

Re: Кодування файлу

Повинно бути:

"abc
def"

а виходить:

abc
def

Знайшов рішення на боці клієнта.
Було:

file_content = file_content + delimiter_symbol.join(str(z) for z in x) + '''
'''

стало:

file_content = file_content + delimiter_symbol.join("\"" + str(z) + "\"" for z in x) + '''
'''

На малому файлі пройшло ок. Пробую на гігантському...

36

Re: Кодування файлу

Пробую на гігантському...

На великих об'ємах знайшлися значення, де в тексті містяться подвійні лапки, через що "екселівські" комірки зсуваються вбік. Як воркераунд, доповнив код string.replace("\"","``") для автозаміни подвійних лапок на дві одинарні ``. Тестую далі.

37

Re: Кодування файлу

не думаю, що отакими замінами ʼлапокʼ чи подібним вдасться ефективно вирішити дану задачу.

чи могли б Ви (звісно, не вдаючись в конкретний проект) описати в чому взагалі полягає бізнес завдання?
тобто - які є типи даних, де вони лежать і що з ними треба зробити.

питання виникло як реакція на ці слова - 'через що "екселівські" комірки зсуваються вбік.'
тобто - первинні документи в excel ?  навіщо тоді csv? чому не передавати оригінал?

що стосується

'latin-1' codec can't encode character '\u2013' in position 5635: Body ('–') is not valid Latin-1. Use body.encode('utf-8') if you want to send it encoded in UTF-8

то , швидше за все, це якраз стається тому, що передаються стрінги, які кожна система перекодовує під себе.

в будь-якому випадку - краще зрозуміти що є , де воно лежить і що з ним треба зробити.
бо "заміни лапок", особливо на великих об'ємах даних, рідко приводять до позитивного результату.
а це образливо - перепроцесити пару сотень гігабайт, витратити десяток годин  і під кінець отримати exception

38 Востаннє редагувалося frz (02.03.2021 11:15:34)

Re: Кодування файлу

в чому взагалі полягає бізнес завдання?

Результати гігантських запитів з бази даних snowflake зберегти в csv на google drive.

"екселівські" комірки зсуваються вбік

Можливо, тут вже не те покоління, однак я ще застав період коли бізнес-користувачі мислили поняттями Екселю; лише через те вжив таке словосполучення, хоча насправді йдеться лише про csv.

"заміни лапок", особливо на великих об'ємах даних, рідко приводять до позитивного результату

В даному випадку спрацювало.

отримати exception

Exception - не вирок, а скерування до дії. Головне отримати сповіщення про exception раніше, ніж користувач побачить що щоденне оновлення не відбулося, аби відповідно відреагувати внесеннями потрібних фіксів в алгоритм. Для цього зробив інтеграцію із slack, головне тепер зліпити всі шматки докупи. Я все ж сподіваюся, що основні моменти враховані і бойове випробування протягом тижня покаже чи це так чи ні.

Так, я розумію що це класичне лого "милиці-ровери-жуки". Яке завдання - така і реалізація. Був інший варіант - зберігати з snowflake напряму в S3, для цього є штатні засоби; однак для використання цього рішення користувачам потрібне додаткове ПЗ - S3 браузер; на презентації варіантів бізнес-користувачі обрали варіант із google drive.

39

Re: Кодування файлу

Вибачте, все одно я не до кінця розумію, що відбувається.
У вас є:
- сервер SnowFlake;
- безкоштовний сервер Google Cloud/Amazon Cloud, який ви хочете використовувати для перекодування;
- Google Drive.
Усе так?
Вам треба дані з таблиці SnowFlake відвантажити на Google Drive. Чому саме в csv? В csv є кілька діалектів для розв'язання проблеми з керівними символами (кома, лапки, новий рядок) всередині значень. Може, проблема саме в виборі діалекту? Наприклад, прогляньте https://docs.python.org/3/library/csv.h … parameters

40

Re: Кодування файлу

offtop

Прихований текст
frz написав:

Можливо, тут вже не те покоління, однак я ще застав період коли бізнес-користувачі мислили поняттями Екселю; лише через те вжив таке словосполучення, хоча насправді йдеться лише про csv.

я застав ще період, коли Екселю не було на світі і писав "програми" для SuperCalc
https://upload.wikimedia.org/wikipedia/ru/a/a2/Supercalc_4.png