Saya perlu menarik data dari elasticsearch, melakukan pembersihan/munging dan mengekspor sebagai tabel/rds.

Untuk melakukan ini, saya memiliki daftar panjang nama variabel yang diperlukan untuk menarik dari elasticsearch. Daftar variabel ini diperlukan untuk tarikan, tetapi masalahnya adalah tidak semua bidang dapat diwakili dalam tarikan yang diberikan, artinya saya perlu menambahkan bidang setelah fakta. Saya dapat melakukan ini menggunakan skema (dalam format json bersarang) dari daftar nama variabel yang sama.

Untuk mencoba dan [sedikit] membuktikan pekerjaan ini di masa mendatang, saya idealnya hanya ingin mempertahankan daftar/skema di satu tempat, dan mengonversi dari daftar ke skema (atau sebaliknya).

Apakah ada cara untuk melakukan ini dengan python? Silakan lihat contoh input dan output yang diinginkan di bawah ini.

Bagian kecil dari skema:

{
  "_source": {
    "filters": {"group": {"filter_value": 0}},
    "user": {
      "email":  "",
      "uid":  ""
    },
    "status": {
      "date": "", 
      "active": True
    }
  }
}

Output daftar string yang diinginkan:

[
"_source.filters.group.filter_value",
"_source.user.email",
"_source.user.uid",
"_source.status.date",
"_source.status.active"
]
 

Saya percaya bahwa skema -> daftar mungkin merupakan transformasi yang lebih mudah daripada daftar -> skema, meskipun saya senang itu menjadi sebaliknya jika itu lebih sederhana (meskipun perlu memastikan variabel skema memiliki tipe yang benar, yaitu str, bool , mengapung).

Saya telah menjelajahi jawaban berikut yang mendekati, tetapi saya berjuang untuk memahami karena tidak ada yang tampak dalam python:

0
FitzKaos 19 November 2020, 20:15

1 menjawab

Jawaban Terbaik

Di mana d adalah json Anda sebagai kamus,

def full_search(d):
    arr = []
    def dfs(d, curr):
        if not type(d) == dict or curr[-1] not in d or type(d[curr[-1]]) != dict:
            arr.append(curr)
            return
        for key in d[curr[-1]].keys():
            dfs(d[curr[-1]], curr + [key])
    for key in d.keys():
        dfs(d, [key])
    return ['.'.join(x) for x in arr]

Jika d dalam bentuk json, gunakan

import json
res = full_search(json.loads(d))
1
Rich Caputo 19 November 2020, 17:51