Использование python для копирования jsonl.gz файл из S3 в ABS и распакуйте по пути

#python #pandas

#питон #панды

Вопрос:

Я использую записную книжку Databricks для копирования jsonl.gz файл из S3 в ABS (мой контейнер ABS уже смонтирован), и файл нужно распаковать в конце процесса. Имена файлов будут введены в записную книжку с помощью переменных «каталог» и «файл». Примером имени файла является ‘folder-date/0000-00-0000.jsonl.gz».

Мне трудно понять точный синтаксис для этого. В настоящее время я застреваю, пытаясь прочитать jsonl.gz файл в фрейм данных. Я получаю ошибку «Неверный путь к файлу или тип объекта буфера: lt;class ‘dict’gt;». Вот что у меня есть до сих пор, любая помощь будет признательна:

 fileun = dbutils.widgets.get("fileun") directory = dbutils.widgets.get("directory") file = fileun[:-3] file_path=directory fileun  import pandas as pd import numpy as np import boto3 import pyodbc import gzip import shutil  client = boto3.client(  "s3",  region_name='region',  aws_access_key_id='key',  aws_secret_access_key='key' )  response=client.get_object(  Bucket='bucket_name',  Key=file_path )  **df = pd.read_json(response, compression='infer')**  with gzip.open(response, 'rb') as f_in:  with open(file, 'wb') as f_out:  shutil.copyfileobj(f_in, f_out)  writefile = open('container_name' % (fileun), 'w')  writefile.write(df) writefile.close()  

Вот фрагмент из одного из файлов:

 {  "uid": "9a926d799f437b0d279c144dec2bcef7cd16db341bca6e7653246d960331d00a",  "doc": {  "snippet": {  "authorProfileImageUrl": null,  "textDisplay": "@Keanu Corps  Same "reasoning" as the democrats. Even though inflation is getting worse.",  "publishedAt": "2021-10-28T09:34:15.334995 0000",  "authorChannelUrl": "/channel/UCsxSW7_bBsbFAjkh7ujctRA",  "authorChannelId": {  "value": "UCsxSW7_bBsbFAjkh7ujctRA"  },  "likeCount": 0,  "videoId": "U2R_srS4TR4",  "authorDisplayName": "The Video Game Hunger 01"  },  "crawlid": "-",  "kind": "youtube#comment",  "correlation_id": "195c9442-74d8-5003-baa3-7f1d05ef5aa6",  "id": "UgznKXgYDDWUEjX0YaZ4AaABAg.9TvZiuGoiMM9U1jbFAWCTn",  "parentId": "UgznKXgYDDWUEjX0YaZ4AaABAg",  "is_reply": true,  "timestamp": "2021-10-28T18:34:15.437543"  },  "system_timestamp": "2021-10-28T18:34:15.944581 00:00",  "norm_attribs": {  "website": "github.com/-",  "type": "youtube",  "version": "1.0"  },  "type": "youtube_comment",  "norm": {  "author": "The Video Game Hunger 01",  "domain": "youtube.com",  "id": "UgznKXgYDDWUEjX0YaZ4AaABAg.9TvZiuGoiMM9U1jbFAWCTn",  "body": "@Keanu Corps  Same "reasoning" as the democrats. Even though inflation is getting worse.",  "author_id": "UCsxSW7_bBsbFAjkh7ujctRA",  "url": "https://www.youtube.com/watch?v=U2R_srS4TR4amp;lc=UgznKXgYDDWUEjX0YaZ4AaABAg.9TvZiuGoiMM9U1jbFAWCTn",  "timestamp": "2021-10-28T09:34:15.334995 00:00"  },  "organization_id": "-",  "sub_organization_id": "default",  "campaign_id": "-",  "project_id": "default",  "project_version_id": "default",  "meta": {  "relates_to_timestamp": [  {  "results": [  "2021-10-28T09:34:15.334995 00:00"  ],  "attribs": {  "website": "github.com/-",  "source": "Explicit",  "type": "Timestamp Extractor",  "version": "1.0"  }  }  ],  "post_type": [  {  "results": [  "post"  ],  "attribs": {  "website": "github.com/-",  "source": "Explicit",  "type": "Post Type Extractor",  "version": "1.0"  }  }  ],  "relates_to": [  {  "results": [  "U2R_srS4TR4"  ],  "attribs": {  "website": "github.com/-",  "source": "Explicit",  "type": "String Extractor",  "version": "1.0"  }  }  ],  "author_name": [  {  "results": [  "The Video Game Hunger 01"  ],  "attribs": {  "website": "github.com/-",  "source": "Explicit",  "type": "String Extractor",  "version": "1.0"  }  }  ],  "author_id": [  {  "results": [  "UCsxSW7_bBsbFAjkh7ujctRA"  ],  "attribs": {  "website": "github.com/-",  "source": "Explicit",  "type": "String Extractor",  "version": "1.0"  }  }  ],  "rule_matcher": [  {  "results": [  {  "metadata": {  "campaign_title": "-",  "project_title": "-",  "maxdepth": 0  },  "sub_organization_id": null,  "description": null,  "project_version_id": "-",  "rule_id": "2569463",  "rule_tag": "-",  "rule_type": "youtube_keyword",  "project_id": "-",  "appid": "nats-main",  "organization_id": "-",  "value": "طالبان شلیک",  "campaign_id": "-",  "node_id": null  }  ],  "attribs": {  "website": "github.com/-",  "source": "Explicit",  "type": "youtube",  "version": "1.0"  }  }  ]  } }  

Ответ №1:

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

Это то, что я использую для загрузки с .gz из s3 непосредственно в фрейм данных.

 import gzip import json s3sr = boto3.resource('s3') obj =s3sr.Object(bucket, key) data = json.loads(gzip.decompress(obj.get()['Body'].read())) df = pd.DataFrame(data)  

И если я открываю .gz из локального, я использую это

 with gzip.open(fullpath, 'rb') as f:  data = json.loads(f.read().decode('utf-8')) df = pd.DataFrame(data)  

Комментарии:

1. Спасибо за помощь. Я добавил фрагмент из одного из файлов к своему первоначальному вопросу, чтобы вы могли увидеть структуру. Когда я запускаю предоставленный вами код, я получаю эту ошибку: «Ошибка JSONDecodeError: Дополнительные данные: строка 2 столбец 1 (символ 32592)»

2. непонятно, что происходит. если я возьму этот фрагмент json и помещу его в файл (gz или несжатый), я смогу прочитать его в кадре данных.

Ответ №2:

Это то, что в конечном итоге привело к копированию файла, но я теряю отдельные объекты в файле, и они отображаются только в одной строке:

 fileun = dbutils.widgets.get("fileun") directory = dbutils.widgets.get("directory") key=directory fileun  import pandas as pd import numpy as np import boto3 import pyodbc import os import gzip import shutil import json  s3_resource = boto3.resource('s3',  aws_access_key_id=[key_id],  aws_secret_access_key= [access_key] my_bucket = s3_resource.Bucket(bucket_name) objects = my_bucket.objects.filter(Prefix= directory fileun) for obj in objects:  path, filename = os.path.split(obj.key) my_bucket.download_file(obj.key, filename)  with gzip.open(filename, 'rb') as f_in:  with open(file, 'wb') as f_out:  shutil.copyfileobj(f_in, f_out)  with open(file) as f:  data = f.readlines() df = pd.DataFrame(data)  jinsert = df.to_json(orient="records") writefile = open('[container_name]' % (file), 'w')  writefile.write(jinsert) writefile.close()