Cara mengunggah banyak file JSON ke CouchDB

Saya baru mengenal CouchDB. Saya perlu mendapatkan 60 atau lebih file JSON dalam satu menit dari server. Saya harus mengunggah file JSON ini ke CouchDB satu per satu segera setelah saya menerimanya. Saya menginstal CouchDB di mesin Linux saya. Saya harap seseorang dapat membantu saya dengan kebutuhan saya. Jika memungkinkan, bisakah seseorang membantu saya dengan kode semu.

Ide saya:

  1. Adalah menulis skrip python untuk mengunggah semua file JSON ke CouchDB.

  2. Setiap file JSON harus berupa setiap dokumen dan data yang ada di JSON harus dimasukkan sama ke dalam CouchDB (format yang ditentukan dengan nilai dalam file).

Catatan:

File JSON ini bersifat Transaksional, setiap detik 1 file dihasilkan jadi saya perlu membaca unggahan file dengan format yang sama ke CouchDB setelah berhasil mengunggah arsip file ke sistem lokal dari folder yang berbeda.


person user3782364    schedule 13.09.2014    source sumber


Jawaban (4)


Saya akan menggunakan API massal CouchDB, meskipun Anda telah menentukan bahwa Anda perlu mengirimkannya ke db satu per satu. Misalnya, dengan menerapkan antrian sederhana yang dikirim setiap 5 - 10 detik melalui panggilan dokumen massal akan sangat meningkatkan kinerja aplikasi Anda.

Jelas ada kekhasan di dalamnya dan Anda perlu mengetahui ID dokumen yang ingin Anda dapatkan dari DB. Tapi untuk PUT itu sempurna. (tidak sepenuhnya benar, Anda bisa mendapatkan rentang dokumen menggunakan operasi massal jika ID yang Anda gunakan untuk dokumen Anda dapat diurutkan dengan baik).

Dari pengalaman saya bekerja dengan CouchDB, saya punya firasat bahwa Anda berurusan dengan dokumen Transaksional untuk mengkompilasinya menjadi semacam hasil penjumlahan dan bertindak berdasarkan data tersebut (mungkin membuat dokumen transaksional berikutnya secara seri). Untuk itu Anda bisa mengandalkan CouchDB dengan menggunakan fungsi 'reduce' pada tampilan yang Anda buat. Dibutuhkan sedikit latihan agar fungsi pengurangan berfungsi dengan baik dan sangat bergantung pada apa yang sebenarnya ingin Anda capai dan data apa yang siap Anda keluarkan dari tampilan, jadi saya tidak bisa memberi Anda detail lebih lanjut tentang itu.

Jadi pada akhirnya logika aplikasi akan menjadi seperti ini:

get _design/someDesign/_view/yourReducedView
calculate new transaction
add transaction to queue

onTimeout
   send all in transaction queue

Jika saya memahami bagian pertama mengapa Anda salah menggunakan dokumen transaksional, yang benar-benar berubah adalah bagian saat Anda mendapatkan dokumen transaksional tersebut dalam logika aplikasi saya.

Selain itu, sebelum menulis fungsi 'reduce' Anda sendiri, lihat yang sudah ada di dalamnya (mereka jauh lebih cepat daripada apa pun di luar mesin db yang dapat dilakukan)

http://wiki.apache.org/couchdb/HTTP_Bulk_Document_API

EDIT: Sejak Anda memulai, saya sangat menyarankan untuk melihat Panduan Definitif CouchDB.

CATATAN UNTUK KEMUDIAN:

Ini adalah salah satu batu tersembunyi (mungkin bukan batu tersembunyi tetapi bukan hal yang jelas harus diwaspadai bagi pendatang baru). Saat Anda menulis fungsi pengurangan, pastikan fungsi tersebut tidak menghasilkan terlalu banyak keluaran untuk kueri tanpa batas. Ini akan sangat memperlambat keseluruhan tampilan bahkan ketika Anda memberikan pengurangan=false saat mengambil sesuatu darinya.

person Dmitry Matveev    schedule 18.09.2014
comment
Mengapa tidak menggunakan dokumen baru dan bukan wiki lama? docs.couchdb .org/en/latest/api/database/ - person Daniel; 18.09.2014

program python untuk mengurai json dan memasukkannya ke CouchDb:

import sys
import glob
import errno,time,os
import couchdb,simplejson
import json
from pprint import pprint

couch = couchdb.Server() # Assuming localhost:5984
#couch.resource.credentials = (USERNAME, PASSWORD)
# If your CouchDB server is running elsewhere, set it up like this:
couch = couchdb.Server('http://localhost:5984/')

db = couch['mydb']


path = 'C:/Users/Desktop/CouchDB_Python/Json_files/*.json'
#dirPath = 'C:/Users/VijayKumar/Desktop/CouchDB_Python'   
files = glob.glob(path)
for file1 in files: 
    #dirs = os.listdir( dirPath )
    file2 = glob.glob(file1)

    for name in file2: # 'file' is a builtin type, 'name' is a less-ambiguous variable name.
        try:
            with open(name) as f: # No need to specify 'r': this is the default.
                #sys.stdout.write(f.read())
                json_data=f
                data = json.load(json_data)
                db.save(data)
                pprint(data)
                json_data.close()
                #time.sleep(2)
        except IOError as exc:
                if exc.errno != errno.EISDIR: # Do not fail if a directory is found, just ignore it.
                    raise # Propagate other kinds of IOError.
person user3782364    schedule 18.09.2014

Jadi, Anda perlu mendapatkan dokumen JSON dari server dan mengirimkannya ke CouchDB saat Anda menerimanya. Skrip Python akan berfungsi dengan baik. Berikut ini beberapa kode semu:

loop (until no more docs)
    get new JSON doc from server
    send JSON doc to CouchDB
end loop

Dengan Python, Anda dapat menggunakan requests untuk mengirim dokumen ke CouchDB dan mungkin untuk mendapatkan dokumen dari server juga (jika menggunakan HTTP API).

person Simon    schedule 16.09.2014
comment
Hai, Terima kasih atas Jawaban Anda. Di sini saya telah menulis kode berdasarkan ide Anda, tolong bantu saya apakah itu benar atau tidak - person user3782364; 18.09.2014
comment
Saya telah memposting jawaban saya, harap balas saya jika ada kesalahan. Karena Anda mungkin menemukan bahwa saya belum mengikuti standar pengkodean, mohon jelaskan kepada saya. - person user3782364; 18.09.2014

Anda mungkin ingin memeriksa modul pycouchdb untuk python3. Saya sendiri telah menggunakannya untuk mengunggah banyak objek JSON ke dalam instance couchdb. Proyek saya berfungsi hampir sama seperti yang Anda jelaskan sehingga Anda dapat melihat proyek saya Pyro di Github untuk detailnya.

Kelas saya terlihat seperti itu:

class MyCouch:
""" COMMUNICATES WITH COUCHDB SERVER """

  def __init__(self, server, port, user, password, database):
    # ESTABLISHING CONNECTION
    self.server = pycouchdb.Server("http://" + user + ":" + password + "@" + server + ":" + port + "/")
    self.db = self.server.database(database)

  def check_doc_rev(self, doc_id):
    # CHECKS REVISION OF SUPPLIED DOCUMENT
    try:
        rev = self.db.get(doc_id)
        return rev["_rev"]
    except Exception as inst:
        return -1

  def update(self, all_computers):
    # UPDATES DATABASE WITH JSON STRING
    try:
        result = self.db.save_bulk( all_computers, transaction=False )
        sys.stdout.write( " Updating database" )
        sys.stdout.flush()
        return result
    except Exception as ex:
        sys.stdout.write( "Updating database" )
        sys.stdout.write( "Exception: " )
        print( ex )
        sys.stdout.flush()

        return None

Beri tahu saya jika ada pertanyaan - Saya akan dengan senang hati membantu jika Anda menemukan beberapa kode saya dapat digunakan.

person mnmnc    schedule 18.11.2014