PDA

View Full Version : وارد کردن داده‌‌ها به صورت خودکار در HBase



M.soheil
شنبه 01 اسفند 1394, 16:47 عصر
سلام

من قصد دارم با پایگاه داده H‌‌Base روی Hadoop یک مثال حل کنم به این صورت که داده‌ها رو از کاربر می‌گیره و داخل پایگاه داده Insert می‌کنه. (مشخصا دفترچه تلفن هست). برای وارد کردن داده‌ها باید یک آبجکت از نوع Put بسازم به این صورت:

Put p = new Put(Bytes.toBytes("row1"));

که نام سطر هم باید به عنوان ورودی داده بشه (در اینجا row1 داده شده). مشکل اینجاست که این نام سطر باید برای همه فیلدها یکتا باشه و من باید برای هر وارد کردن داده جدید کد رو دستکاری کنم و نام جدیدی بهش بدم که این کار اصولی نیست. حالا می‌خوام بدونم چطور می‌تونم این نام سطر رو به صورت اتوماتیک و خودکار generate کنم که نیاز نباشه هر بار کد رو تغییر بدم.
اگر هم فیلیدی با این نام در پایگاه داده وجود داشته باشه، داده جدید رو روی اون رونویسی می‌کنه.

کد کامل برنامه به صورت زیر هست:

String fName, lName, number ;
Scanner in = new Scanner (System.in) ;
System.out.println("Wainting for taking new phone number info ...\n");
System.out.println("Please Enter first name : ");
fName = in.nextLine() ;
System.out.println("Please Enter last name : ");
lName = in.nextLine() ;
System.out.println("Please Enter number : ");
number = in.nextLine() ;


Configuration config = HBaseConfiguration.create();
HTable hTable = new HTable(config, "phoneList");
Put p = new Put(Bytes.toBytes("row1"));
p.add(Bytes.toBytes("personal"), Bytes.toBytes("firstName")
,Bytes.toBytes(fName));
p.add(Bytes.toBytes("personal"), Bytes.toBytes("lastName")
,Bytes.toBytes(lName));
p.add(Bytes.toBytes("phone"), Bytes.toBytes("number")
,Bytes.toBytes(number));
hTable.put(p);
hTable.close();

in.close();

امیدوارم که منظورمو درست رسونده باشم. اگر جایی گنگ بود بفرمایید بیشتر توضیح بدم.

تشکر

مبین رنجبر
یک شنبه 02 اسفند 1394, 05:36 صبح
نکته خیلی مهم این است که در هنگام کار با پایگاه داده های NoSQL باید نحوه نگرش و تفکر ما از تفکر رابطه ای به منطق های مربوط به خودش تغییر کند. نام سطری که فرمودید در واقع همان کلید سطر یا rowkey است که تولید خودکار و یا افزایشی آن طبق مستندات خود HBase اصلا پیشنهاد نمی شود و مشکلاتی را هم ممکن است به همراه داشته باشد.

ولی می توانید با کد زیر بررسی کنید که سطری با آن کلید آیا وجود دارد یا خیر:


Get get = new Get(rowkey);
Result result = htable.get(get);
if (!result.isEmpty()) {
throw new Exception("Row with this key already exists.");
}

M.soheil
یک شنبه 02 اسفند 1394, 06:32 صبح
ممنونم

پس راه حل اصولی برای این‌که مجبور نباشیم در هر بار وارد کردن داده به پایگاه داده، کد رو تغییر بدیم چی هست؟

با این تفاسیر فکر کنم باید کلید رو از کاربر بگیریم و بعد بررسی کنیم که قبلا وجود نداشته باشه.

مبین رنجبر
یک شنبه 02 اسفند 1394, 06:51 صبح
ممنونم

پس راه حل اصولی برای این‌که مجبور نباشیم در هر بار وارد کردن داده به پایگاه داده، کد رو تغییر بدیم چی هست؟

با این تفاسیر فکر کنم باید کلید رو از کاربر بگیریم و بعد بررسی کنیم که قبلا وجود نداشته باشه.

نیازی به تغییر کد و گرفتن کلید از کاربر نیست. به طور مثال در یک سیستم بلاگ دهی در CF مربوط به پست های بلاگ،کلید هر سطر می تواند ترکیبی از نام کاربری و زمان ایجاد باشد. به صورت زیر:


Put put = new Put("sampleUser_" + created_time);