मेरे पास मेरे एडब्ल्यूएस एस 3 बाल्टी के नीचे कई चाबियां हैं। संरचना है:

bucket/tableName1/Archive/archive1.json -से-bucket/tableName1/Archive/archiveN.json Bucket/tableName2/Archive/archive2.json -से-bucket/tableName2/Archive/archiveN.json बकेट/टेबलनाम1/ऑडिट/ऑडिट1.json -से- बकेट/टेबलनाम1/ऑडिट/ऑडिटN.json बकेट/टेबलनाम2/ऑडिट/ऑडिट2.जेसन -से- बकेट/टेबलनाम2/ऑडिट/ऑडिटएन.जेसन

मैं ऑडिट फ़ोल्डर से चाबियां केवल तभी प्राप्त करना चाहता हूं जब यह एक कुंजी में मौजूद हो और केवल नवीनतम फ़ाइल प्राप्त करें यानी उस ऑडिट फ़ोल्डर से अंतिम संशोधित समय सबसे हाल का हो।

परिणाम जो मैं प्राप्त करने का प्रयास कर रहा हूं वह शब्दकोश की एक सूची है:

[{'tableName1' : 'auditN.json'}, {'tableName2' : 'auditN.json'}]

मान लें कि auditN.json नवीनतम फ़ाइल है।

मैंने विभिन्न तरीकों की कोशिश की लेकिन मुझे वांछित परिणाम नहीं मिल रहा है। मैं डेटाब्रिक्स नोटबुक पर समाधान की कोशिश कर रहा हूं। क्या कोई तरीका है जिससे मैं इसे हासिल कर सकता हूं?

2
tarun kumar Sharma 6 नवम्बर 2019, 00:08

1 उत्तर

सबसे बढ़िया उत्तर

खैर, आप जो पूछ रहे हैं उसके बारे में मैं बहुत सारे धागे पढ़ और खोज रहा हूं लेकिन कोई भाग्य नहीं है। तो, मुझे अपना खुद का लैम्ब्डा फ़ंक्शन लिखना पड़ा।

निम्नलिखित कोड स्निपेट सभी फ़ोल्डरों पर पुनरावृति करता है, फिर सबफ़ोल्डर्स पर पुनरावृति करता है कि क्या सबफ़ोल्डर नाम == ऑडिट, यदि यह करता है- अंतिम संशोधित द्वारा क्रमबद्ध करें और नवीनतम ऑब्जेक्ट को प्रिंट करें।

ध्यान रखें कि यह कोड केवल आपकी संरचना में फिट बैठता है! चूंकि list_folders फ़ंक्शन केवल पहले सबफ़ोल्डर लौटाता है।

यदि आपकी संरचना कुछ इस तरह बदल गई है:

bucket/tableName1/Audit/Audit1/audit.json

लैम्ब्डा काम नहीं करेगा।

सांकेतिक टुकड़ा :

import boto3

#bucket Name
bucket_name = 'Bucket Name'
#bucket Resource
s3 = boto3.resource('s3')
bucket = s3.Bucket(bucket_name)

#bucket client
s3_client = boto3.client("s3")

#filter pattern 
get_last_modified = lambda obj: int(obj.last_modified.strftime('%s'))

#get subfolder - 1 LEVEL ONLY ! 
def list_folders(s3_client, bucket_name,prefix):
    response = s3_client.list_objects_v2(Bucket=bucket_name,Prefix=prefix, Delimiter='/')
    for content in response.get('CommonPrefixes', []):
        yield content.get('Prefix')

def lambda_handler(event, context):
    #get all folders 
    folder_list = list_folders(s3_client, bucket_name,'')
    for folder in folder_list:
        #get all subfolders
        subfolders =  list_folders(s3_client, bucket_name,folder)
        for subfolder in subfolders:
            #iterate over subfolders and check if subfolder name equal to Audit
            if 'Audit' == subfolder.split('/')[1]:
                #get all objects under subfolder
                objs = [obj for obj in bucket.objects.filter(Prefix= subfolder)]
                #sort by last modified by filter pattern and get the first object 
                last_modified_file = [obj for obj in sorted(objs, key=get_last_modified)][-1]
                #print results
                print('Last modified file Name: %s ---- Date: %s' % (last_modified_file.key,last_modified_file.last_modified))

निम्नलिखित फाइलों के खिलाफ परीक्षण किया गया: यहां छवि विवरण दर्ज करें

Table2 उपफोल्डर जिसका नाम Archive है। यहां छवि विवरण दर्ज करें

enter image description here

आउटपुट:

enter image description here

आशा है कि आपको यह मददगार लगेगा।

1
Amit Baranes 7 नवम्बर 2019, 01:06