#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()