it-swarm.dev

كيفية حذف وتحديث سجل في خلية النحل

لقد قمت بتثبيت Hadoop ، خلية ، خلية دينار بحريني قبل الميلاد. التي تعمل بشكل جيد بالنسبة لي. ولكن لا يزال لدي مشكلة. كيفية حذف أو تحديث سجل واحد باستخدام Hive لأن أمر حذف أو تحديث MySQL لا يعمل في Hive.

شكر

Hive> delete from student where id=1;
Usage: delete [FILE|JAR|ARCHIVE] <value> [<value>]*
Query returned non-zero code: 1, cause: null
51
Charnjeet Singh

يجب أن لا تفكر في خلية Hive باعتبارها RDBMS عادية ، Hive هو الأنسب لمعالجة الدُفعات على مجموعات كبيرة جدًا من البيانات غير القابلة للتغيير.

ينطبق ما يلي على الإصدارات السابقة للخلية 0.14 ، راجع إجابةashtonium للإصدارات الأحدث.

لا توجد عملية مدعومة لحذف أو تحديث لسجل معين أو مجموعة معينة من السجلات ، وهذا بالنسبة لي هو علامة على مخطط فقير.

إليك ما يمكنك العثور عليه في الوثائق الرسمية :

Hadoop is a batch processing system and Hadoop jobs tend to have high latency and
incur substantial overheads in job submission and scheduling. As a result -
latency for Hive queries is generally very high (minutes) even when data sets
involved are very small (say a few hundred megabytes). As a result it cannot be
compared with systems such as Oracle where analyses are conducted on a
significantly smaller amount of data but the analyses proceed much more
iteratively with the response times between iterations being less than a few
minutes. Hive aims to provide acceptable (but not optimal) latency for
interactive data browsing, queries over small data sets or test queries.

Hive is not designed for online transaction processing and does not offer
real-time queries and row level updates. It is best used for batch jobs over
large sets of immutable data (like web logs).

هناك طريقة للتغلب على هذا القيد وهي استخدام الأقسام: لا أعرف ما الذي تقابله {id ، ولكن إذا كنت تحصل على مجموعات مختلفة من المعرفات بشكل منفصل ، فيمكنك إعادة تصميم الجدول الخاص بك بحيث يكون مقسومًا بواسطة id ، وبعد ذلك ستتمكن بسهولة من إسقاط أقسام للمعرفات التي تريد التخلص منها.

62
Charles Menguy

اعتبارًا من الإصدار Hive 0.14.0 : INSERT ... أصبحت القيم ، و UPDATE ، و DELETE متاحة الآن بدعم ACID الكامل.

INSERT ... VALUES بناء الجملة:

INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] VALUES values_row [, values_row ...]

حيث value_row هي: (value [، value ...]) حيث تكون القيمة فارغة أو أي SQL حرفي صالح

تحديث البنية:

UPDATE tablename SET column = value [, column = value ...] [WHERE expression]

حذف الجملة:

DELETE FROM tablename [WHERE expression]

بالإضافة إلى ذلك ، من المستند Hive Transactions:

إذا كان يجب استخدام جدول في كتابة ACID (إدراج ، تحديث ، حذف) ، فيجب تعيين خاصية الجدول "معاملات" على هذا الجدول ، بدءًا من Hive 0.14.0. بدون هذه القيمة ، سيتم إدراجها في النمط القديم ؛ سيتم حظر التحديثات وحذفها.

مرجع خلية DML:
https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+DML
مرجع معاملات خلية النحل:
https://cwiki.Apache.org/confluence/display/Hive/Hive+Tactactions

86
ashtonium

نعم ، قال بحق. خلية لا يدعم خيار التحديث. ولكن البديل التالي يمكن استخدامه لتحقيق النتيجة:

تحديث السجلات في partitioned Hive table:

  1. يفترض أن يتم تقسيم الجدول الرئيسي بواسطة مفتاح ما.
  2. قم بتحميل البيانات الإضافية (البيانات المطلوب تحديثها) إلى جدول مرحلي مقسم بنفس مفاتيح الجدول الرئيسي.
  3. انضم إلى الجدولين (الجداول الرئيسية والتدريجية) باستخدام عملية LEFT OUTER JOIN على النحو التالي:

قم بإدراج قسم الكتابة فوق الجدول main_table (c ، d) حدد t2.a ، t2.b ، t2.c ، t2.d من staging_table t2 ترك الرابط الخارجي main_table t1 على t1.a = t2.a؛

في المثال أعلاه ، يتم تقسيم main_table و staging_table باستخدام مفاتيح (c ، d). يتم ربط الجداول عبر LEFT OUTER JOIN ويتم استخدام النتيجة لتجاوز الأقسام الموجودة في main_table.

يمكن استخدام نهج مماثل في حالة عملياتun-partitioned Hive tableUPDATE أيضًا.

17
Sudeesh Kumar

يمكنك حذف الصفوف من جدول باستخدام حل بديل ، حيث يمكنك الكتابة فوق الجدول بمجموعة البيانات التي تريد تركها في الجدول كنتيجة لعملية التشغيل.

insert overwrite table your_table 
    select * from your_table 
    where id <> 1
;

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

6
user11788

إذا كنت ترغب في حذف جميع السجلات ثم كحل مؤقت ، قم بتحميل ملف فارغ في الجدول في وضع الكتابة الفوقية

Hive> LOAD DATA LOCAL INPATH '/root/hadoop/textfiles/empty.txt' OVERWRITE INTO TABLE employee;
Loading data to table default.employee
Table default.employee stats: [numFiles=1, numRows=0, totalSize=0, rawDataSize=0]
OK
Time taken: 0.19 seconds

Hive> SELECT * FROM employee;
OK
Time taken: 0.052 seconds
3
Kaushik Lele

أخبرك CLI أين يقع خطأك: delete WHAT? from student ...

حذف: كيفية حذف/اقتطاع الجداول من Hadoop-Hive؟

تحديث: تحديث ، خيار SET في الخلية

3
Apaachee

قيم التكوين المراد تعيينها لـ INSERT و UPDATE و DELETE بالإضافة إلى المعلمات الجديدة المذكورة أعلاه ، يجب تعيين بعض المعلمات الحالية لدعم INSERT ... VALUES و UPDATE و DELETE.

مفتاح التكوين يجب تعيين إلى

Hive.support.concurrency true (default is false) Hive.enforce.bucketing true (default is false) (Not required as of Hive 2.0) Hive.exec.dynamic.partition.mode nonstrict (default is strict)

قيم التكوين لتعيين للضغط

إذا كانت البيانات الموجودة في النظام الخاص بك ليست مملوكة من قبل مستخدم Hive (أي المستخدم الذي يعمل به Hast metastore كما هو) ، فسوف تحتاج Hive إلى إذن للتشغيل كمستخدم يمتلك البيانات من أجل إجراء عمليات ضغط. إذا كنت قد قمت بالفعل بإعداد HiveServer2 لانتحال شخصية المستخدمين ، فإن العمل الإضافي الوحيد الذي يجب القيام به هو التأكد من أن Hive لها الحق في انتحال شخصية المستخدمين من Host الذي يقوم بتشغيل Hast metastore. يتم ذلك عن طريق إضافة اسم المضيف إلى hadoop.proxyuser.Hive.hosts في ملف core-site.xml الخاص بـ Hadoop. إذا لم تكن قد قمت بذلك بالفعل ، فستحتاج إلى تكوين Hive لتعمل كمستخدم وكيل. يتطلب هذا منك إعداد keytabs للمستخدم الذي يقوم بتشغيل Hast metastore وإضافة hadoop.proxyuser.Hive.hosts و hadoop.proxyuser.Hive.groups إلى ملف core-site.xml الخاص بـ Hadoop. راجع وثائق Hadoop في الوضع الآمن لإصدار Hadoop (على سبيل المثال ، بالنسبة إلى Hadoop 2.5.1 في Hadoop في الوضع الآمن).

بيان UPDATE له القيود التالية:

يجب أن يكون التعبير في جملة WHERE تعبيرًا مدعومًا بجملة Hive SELECT.

لا يمكن تحديث أعمدة التقسيم والجرافة.

يتم تعطيل vectorization الاستعلام تلقائيًا لبيانات UPDATE. ومع ذلك ، لا يزال من الممكن الاستعلام عن الجداول المحدثة باستخدام vectorization.

لا يُسمح بالاستعلامات الفرعية على الجانب الأيمن من عبارة SET.

يوضح المثال التالي الاستخدام الصحيح لهذا البيان:

UPDATE students SET name = null WHERE gpa <= 1.0;

بيان الحذف

استخدم عبارة DELETE لحذف البيانات المكتوبة بالفعل إلى Apache Hive.

DELETE FROM tablename [WHERE expression];

تحتوي عبارة DELETE على القيد التالي: يتم تعطيل vectorization الاستعلام تلقائيًا لعملية DELETE. ومع ذلك ، لا يزال من الممكن الاستعلام عن الجداول التي تحتوي على بيانات محذوفة باستخدام vectorization.

يوضح المثال التالي الاستخدام الصحيح لهذا البيان:

DELETE FROM students WHERE gpa <= 1,0;

3
dilshad

بمجرد تثبيت Hive وتكوينه ، قم بإنشاء جدول بسيط:

Hive>create table testTable(id int,name string)row format delimited fields terminated by ',';

ثم ، حاول إدراج عدد قليل من جدول اختبار rowsin.

Hive>insert into table testTable values (1,'row1'),(2,'row2');

الآن حاول حذف السجلات ، لقد أدخلت للتو في الجدول.

Hive>delete from testTable where id = 1;

خطأ! فشل: SemanticException [خطأ 10294]: محاولة القيام بالتحديث أو الحذف باستخدام مدير المعاملات الذي لا يدعم هذه العمليات.

افتراضيا يتم تكوين المعاملات لتكون خارج. يقال أن التحديث غير معتمد مع عملية الحذف المستخدمة في مدير التحويل. لدعم التحديث/الحذف ، يجب عليك تغيير التكوين التالي.

cd  $Hive_HOME
vi conf/Hive-site.xml

إضافة الخصائص أدناه للملف

<property>
  <name>Hive.support.concurrency</name>
  <value>true</value>
 </property>
 <property>
  <name>Hive.enforce.bucketing</name>
  <value>true</value>
 </property>
 <property>
  <name>Hive.exec.dynamic.partition.mode</name>
  <value>nonstrict</value>
 </property>
 <property>
  <name>Hive.txn.manager</name>
  <value>org.Apache.hadoop.Hive.ql.lockmgr.DbTxnManager</value>
 </property>
 <property>
  <name>Hive.compactor.initiator.on</name>
  <value>true</value>
 </property>
 <property>
  <name>Hive.compactor.worker.threads</name>
  <value>2</value>
 </property>

أعد تشغيل الخدمة ثم حاول حذف الأمر مرة أخرى:

خطأ!

فشل: LockException [خطأ 10280]: خطأ في الاتصال مع metastore.

هناك مشكلة مع metastore. من أجل استخدام عملية الإدراج/التحديث/الحذف ، تحتاج إلى تغيير التكوين التالي في conf/Hive-site.xml لأن الميزة قيد التطوير حاليًا.

<property>
  <name>Hive.in.test</name>
  <value>true</value>
 </property>

أعد تشغيل الخدمة ثم احذف الأمر مرة أخرى:

Hive>delete from testTable where id = 1;

خطأ!

فشل: SemanticException [خطأ 10297]: محاولة القيام بالتحديث أو الحذف على الجدول default.testTable لا يستخدم AcidOutputFormat أو لم يتم حذفه.

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

يجب أن يتم دمج الجداول للاستفادة من هذه الميزات. لا تحتاج الجداول في نفس النظام الذي لا يستخدم المعاملات و ACID إلى حذفها.

انظر أدناه مثال للجدول المبني باستخدام ORCFileformat ، وتم تمكين الجرافة و ('المعاملات' = 'true').

Hive>create table testTableNew(id int ,name string ) clustered by (id) into 2 buckets stored as orc TBLPROPERTIES('transactional'='true');

إدراج :

Hive>insert into table testTableNew values (1,'row1'),(2,'row2'),(3,'row3');

تحديث :

Hive>update testTableNew set name = 'updateRow2' where id = 2;

حذف :

Hive>delete from testTableNew where id = 1;

اختبار :

Hive>select * from testTableNew ;
2
Devesh Sharma

سيسمح الإصدار القادم من Hive بمعالجة التحديث/الحذف على أساس SET والذي يعد ذو أهمية قصوى عند محاولة إجراء عمليات CRUD على "مجموعة" من الصفوف بدلاً من أخذ صف واحد في كل مرة.

في غضون ذلك ، لقد جربت أسلوبًا يستند إلى قسم ديناميكي تم توثيقه هنا http://linkd.in/1Fq3wdb .

يرجى معرفة ما إذا كان يناسب حاجتك.

2
Devopam Mittra

UPDATE أو DELETE السجل غير مسموح به في Hive ، لكن INSERT INTO مقبول.
مقتطف من Hadoop: الدليل النهائي (الطبعة الثالثة) :

التحديثات والمعاملات والفهارس هي الدعائم الأساسية لقواعد البيانات التقليدية. حتى الآن ، لم يتم اعتبار هذه الميزات جزءًا من مجموعة ميزات Hive. هذا لأنه تم تصميم Hive للعمل على بيانات HDFS باستخدام MapReduce ، حيث تعتبر عمليات مسح الجدول الكامل هي القاعدة ويتم تحقيق تحديث الجدول من خلال تحويل البيانات إلى جدول جديد. بالنسبة لتطبيق تخزين البيانات الذي يعمل على أجزاء كبيرة من مجموعة البيانات ، يعمل هذا بشكل جيد.

لا يدعم Hive التحديثات (أو يحذف) ، لكنه يدعم INSERT INTO ، لذلك من الممكن إضافة صفوف جديدة إلى جدول موجود.

1
zeekvfu

في الآونة الأخيرة كنت أتطلع لحل مشكلة مماثلة ، لا تدعم Apache Hive ، Hadoop عمليات التحديث/الحذف. وبالتالي ؟ إذن لديك طريقتان:

  1. استخدم جدول نسخ احتياطي: احفظ الجدول بالكامل في backup_table ، ثم اقتطع جدول الإدخال الخاص بك ، ثم أعد كتابة البيانات التي تهتم بها فقط لتثبيتها.
  2. استخدم Uber Hudi : إنه إطار تم إنشاؤه بواسطة Uber لحل قيود HDFS بما في ذلك الحذف والتحديث. يمكنك إلقاء نظرة على هذا الرابط: https://eng.uber.com/hoodie/

مثال على النقطة 1:

Create table bck_table like input_table;
Insert overwrite table bck_table 
    select * from input_table;
Truncate table input_table;
Insert overwrite table input_table
    select * from bck_table where id <> 1;

NB: إذا كان input_table عبارة عن جدول خارجي ، فيجب عليك اتباع الرابط التالي: كيفية اقتطاع جدول خارجي مقسم في الخلية؟

0
Yardi

لتحقيق حاجتك الحالية ، تحتاج إلى إطلاق أدناه الاستعلام

> insert overwrite table student 
> select *from student 
> where id <> 1;

سيؤدي هذا إلى حذف الجدول الحالي وإنشاء جدول جديد بنفس الاسم مع كل الصفوف باستثناء الصفوف التي تريد استبعادها/حذفها

حاولت هذا على خلية 1.2.1

0
Rushikesh Garadade

تمت إضافة الحذف مؤخرًا في Hive الإصدار 0.14 لا يمكن إجراء الحذف إلا على الجداول التي تدعم ACID. أدناه الرابط من Apache.

https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-Delete

0
Abid

الأخبار السارة والتحديثات إدراج وحذف ممكنة الآن على Hive/Impala باستخدام كودو.

تحتاج إلى استخدام IMPALA/kudu للحفاظ على الجداول وإدخال/إدخال/حذف السجلات. التفاصيل مع أمثلة يمكن العثور عليها هنا: insert-update-delete-on-hadoop

يرجى مشاركة الأخبار إذا كنت متحمس.

-MIK

0
Mufaddal Kamdar