سؤال

هل هناك طريقة فعالة لحذف صفوف متعددة في HBase أم أن رائحة حالة الاستخدام الخاصة بي غير مناسبة لـ HBase؟

هناك جدول يقول "الرسم البياني" ، والذي يحتوي على عناصر موجودة في المخططات. مفاتيح الصف بالتنسيق التالي:chart|date_reversed|ranked_attribute_value_reversed|content_id

في بعض الأحيان ، أرغب في تجديد الرسم البياني لتاريخ معين ، لذلك أريد حذف جميع الصفوف التي تبدأ من "الرسم البياني | Date_reversed_1" حتى "الرسم البياني | Date_reversed_2". هل هناك طريقة أفضل من إصدار حذف لكل صف موجود عن طريق الفحص؟ جميع الصفوف المراد حذفها ستكون قريبة من بعضها البعض.

أحتاج إلى حذف الصفوف ، لأنني لا أريد عنصرًا واحدًا (محتوى واحد) أن يحتوي على إدخالات متعددة ستحصل عليها إذا تم تغيير reaseed_attribute_value (تغييره هو السبب في حاجة المخطط إلى تجديده).

كوني مبتدئًا في HBase ، لذلك ربما أسيء استخدام صفوف لشيء ستكون الأعمدة أفضل - إذا كان لديك اقتراحات تصميم ، رائعة! أو ربما يتم إنشاء المخططات بشكل أفضل في ملف (على سبيل المثال لا HBase للإخراج)؟ أنا أستخدم MapReduce.

هل كانت مفيدة؟

المحلول

أولاً ، الوصول إلى نقطة حذف النطاق لا يوجد حذف نطاق حتى الآن في HBase ، AFAIK. ولكن هناك طريقة لحذف أكثر من صف واحد في وقت واحد في HtableInterface API. لهذا ببساطة تشكل كائن حذف مع مفاتيح الصف من المسح الضوئي ووضعها في قائمة واستخدام واجهة برمجة التطبيقات ، تم القيام به! لجعل الفحص بشكل أسرع لا تشمل أي عائلة عمود في نتيجة المسح لأن كل ما تحتاجه هو مفتاح الصف لحذف الصفوف الكاملة.

ثانياً ، حول التصميم. أولاً ، فهمي للمتطلبات هو ، هناك محتويات مع معرف المحتوى ، وكل محتوى قد تم إنشاؤه ضدهم وتخزين تلك البيانات ؛ يمكن أن يكون هناك العديد من المخططات لكل محتوى عبر التواريخ ويعتمد على المرتبة. بالإضافة إلى ذلك ، نريد عرض مخطط المحتوى الذي تم إنشاؤه الأخير في الجزء العلوي من الجدول.

لافتراضي للمتطلبات ، أود أن أقترح استخدام ثلاثة جداول - Auto_ID ، content_charts و endrended_order. سيكون مفتاح الصف لـ Content_charts هو معرف المحتوى الخاص به وسيكون مفتاح الصف لـ endrended_order طويل تلقائي استخدام HtableInterface API. للتخفيض الاستخدام "-1" كمبلغ تعويض وتهيئة القيمة long.max_value في جدول Auto_id في البداية الأولى للتطبيق أو يدويًا. حتى الآن إذا كنت ترغب في حذف بيانات المخطط ، فما عليك سوى تنظيف عائلة العمود باستخدام حذف ثم أعد البيانات الجديدة ثم قم بوضعها في جدول intered_order. وبهذه الطريقة ، سيكون أحدث إدخال في الجزء العلوي في أحدث جدول إدخال سيحتفظ بمعرف المحتوى كقيمة خلية. إذا كنت ترغب في التأكد من وجود إدخال واحد فقط لكل محتوى ، احفظ معرف intered_order أولاً واتخذ القيمة وحفظه في content_charts عند وضع وقبل حذف عائلة العمود أولاً ، قم بحذف الصف من endrenged_order. وبهذه الطريقة ، يمكنك البحث والمخططات للمحتوى باستخدام 2 يحصل على الحد الأقصى ولا يوجد فحص مطلوب للمخططات.

آمل أن يكون هذا مفيدا.

نصائح أخرى

يمكنك استخدام BulkDeleteProtocol الذي يستخدم فحصًا يحدد النطاق ذي الصلة (صف ابدأ ، الصف النهائي ، المرشحات).

نرى هنا

واجهت وضعك وهذا هو رمزتي لتنفيذ ما تريد

Scan scan = new Scan();
    scan.addFamily("Family");
    scan.setStartRow(structuredKeyMaker.key(starDate));
    scan.setStopRow(structuredKeyMaker.key(endDate + 1));
try {
    ResultScanner scanner = table.getScanner(scan);


    Iterator<Entity> cdrIterator = new EntityIteratorWrapper(scanner.iterator(), EntityMapper.create(); // this is a simple iterator that maps rows to exact entity of mine, not so important ! 

    List<Delete> deletes = new ArrayList<Delete>();
    int bufferSize = 10000000; // this is needed so I don't run out of memory as I have a huge amount of data ! so this is a simple in memory buffer
    int counter = 0;
    while (entityIterator.hasNext()) {
        if (counter < bufferSize) {
                            // key maker is used to extract key as byte[] from my entity 
            deletes.add(new Delete(KeyMaker.key(entityIterator.next())));
            counter++;

        } else {
            table.delete(deletes);
            deletes.clear();
            counter = 0;
        }
    }

    if (deletes.size() > 0) {
        table.delete(deletes);
        deletes.clear();
    }

} catch (IOException e) {
    e.printStackTrace();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top