Hive dahili tabloları ile harici tablolar arasındaki fark?


110

Biri bana Hive'ın dış tablosu ile iç tabloları arasındaki farkı söyleyebilir mi? Farkın masayı düşürdüğünde geldiğini biliyorum. Verilerle ne kastettiğinizi anlamıyorum ve meta veriler dahili olarak silinir ve harici tablolarda yalnızca meta veriler silinir. Biri beni düğümler açısından açıklayabilir mi lütfen?

Yanıtlar:


118

Hive, durumu takip etmek için kullandığı ana düğümde ilişkisel bir veritabanına sahiptir. Örneğin, senCREATE TABLE FOO(foo string) LOCATION 'hdfs://tmp/'; , bu tablo şeması veritabanında saklanır.

Bölümlenmiş bir tablonuz varsa, bölümler veritabanında saklanır (bu, kovanın bölüm listelerini dosya sistemine gitmeden ve onları bulmadan vb. Kullanmasına izin verir). Bu tür şeyler "meta veriler" dir.

Dahili bir tabloyu düşürdüğünüzde, verileri ve ayrıca meta verileri de bırakır.

Harici bir tabloyu düşürdüğünüzde, yalnızca meta verileri bırakır. Bu, kovanın şu anda bu verilerden habersiz olduğu anlamına gelir. Verinin kendisine dokunmaz.


tamam .. örneğin harici bir tablo oluşturdum .. ve onu bıraktım. ne oluyor? Verilere dokunulmadan ne demek istiyorsun? bu tablonun bir seçim * verirsem görüntülenecek mi? Farkı hayal edemiyorum.
DrewRose

11
Bir tabloyu düşürürseniz, Hive tabloyu düşürmeden önceki durumu döndürür. foo'yu bıraktıktan sonra 'foo'dan * seçin' sorgusunu çalıştırırsanız, hive size tablonun olmadığını söyleyecektir. Bunun nedeni, Hive'a o masayı unutmasını söylemiş olmanızdır. Veriler, daha önce bulunduğu dosya sisteminde hala mevcuttur. Meta veriyi, verilerin bulunduğu yere bir 'işaretçi' olarak düşünün.
2013

1
Yani dis location opt / nancy / foo.txt dosyasında verilerim varsa ve bunu harici tabloya yükleyip bıraksam, meta veriler kaybolur ancak bu konumdaki veriler opt / nancy / foo.txt kalır mı diyorsunuz?
DrewRose

Tamam, şimdi bu konum HDFS'de mi yoksa yerel sistemimde mi? Yerel sistemde ise, verileri dahili bir tabloya yüklediğimde ve tabloyu bıraktığımda foo.txt dosyası hala o konumda kalacak. şu ana kadar haklı mıyım?
DrewRose

3
Yığın tabloları desteklenen bir dosya sistemindedir (Hbase, HDFS, S3, vb.). Yerel bir dosyadan bir kovan tablosuna veri yüklemek için "LOAD DATA" kullandığınızı varsayıyorum. Bu durumda, yerel dosyayı bir kovan tablosuna kopyalıyorsunuz. Bu tabloyu düşürdüğünüzde, dahili tablodaki verilerin kopyası silinecek, ancak "LOAD DATA" komutundaki kaynak dosyası hala sağlam kalacaktır.
önsöz

102

Kovan tabloları HARİCİ veya DAHİLİ olarak oluşturulabilir. Bu, verilerin nasıl yüklendiğini, kontrol edildiğini ve yönetildiğini etkileyen bir seçimdir.

Şu durumlarda HARİCİ tabloları kullanın:

  1. Veriler ayrıca Hive dışında da kullanılır. Örneğin, veri dosyaları, dosyaları kilitlemeyen mevcut bir program tarafından okunur ve işlenir.
  2. DROP TABLE sonrasında bile verilerin temel konumda kalması gerekir. Bu, tek bir veri kümesine birden çok şemayı (tablo veya görünüm) işaret ediyorsanız veya çeşitli olası şemalar arasında yineleme yapıyorsanız geçerli olabilir.
  3. ASV gibi özel bir konum kullanmak istiyorsunuz.
  4. Hive, veri ve kontrol ayarlarına, dizinlere vb. Sahip olmamalıdır, bunları yapacak başka bir programınız veya işleminiz vardır.
  5. Mevcut tabloyu temel alan tablo oluşturmuyorsunuz (AS SELECT).

DAHİLİ tabloları şu durumlarda kullanın:

Veriler geçicidir.

Hive'ın tablonun ve verilerin yaşam döngüsünü tamamen yönetmesini istiyorsunuz.



DAHİLİ bir tablo oluşturmak, verileri HDFS'den silecek mi yoksa bir kopya oluşturup yalnızca kaynağı (HDFS) olduğu gibi bırakarak kovan için mi kullanacak?
luckyluke

@swetha Merhaba, buraya geldim çünkü metastore.db'yi tamamen sildim ancak veriler hdfs'de kalıyor. Bu yüzden tabloları gösterdiğimde hiçbir şey gösterilmiyor. Meta verileri yeniden oluşturmanın bir yolu var mı?
awadhesh14

47

Size cevap vermek için Soru:

Harici Tablolar için Hive, verileri tablonun oluşturulması sırasında belirtilen LOCATION'da depolar (genellikle ambar dizininde değil). Harici tablo bırakılırsa, tablo meta verileri silinir ancak veriler silinmez.

Dahili tablolar için Hive, verileri ambar dizininde depolar. Tablo düşürülürse, hem tablo meta verileri hem de veriler silinecektir.


Senin referansın için,

İç ve Dış tablolar arasındaki fark:

Dış Tablolar için -

  • Harici tablo, dosyaları HDFS sunucusunda depolar, ancak tablolar kaynak dosyaya tamamen bağlanmaz.

  • Harici bir tabloyu silerseniz, dosya hala HDFS sunucusunda kalır.

    Örnek olarak, HIVE-QL kullanarak HIVE'da "table_test" adlı harici bir tablo oluşturursanız ve tabloyu "dosya" dosyasına bağlarsanız , "table_test" HIVE'dan silindiğinde " dosya " HDFS'den silinmez .

  • Harici tablo dosyalarına HDFS dosya yapısına erişimi olan herkes erişebilir ve bu nedenle güvenliğin HDFS dosya / klasör düzeyinde yönetilmesi gerekir.

  • Meta veriler ana düğümde tutulur ve harici bir tablonun HIVE'dan silinmesi verileri / dosyayı değil yalnızca meta verileri siler.


İç Tablolar için-

  • Ayarlara dayalı bir dizinde saklanan hive.metastore.warehouse.dir, depolandığı varsayılan iç tablolar ile aşağıdaki dizinde “/ user / kovan / depo” yapılandırma dosyasındaki konumu güncelleyerek bunu değiştirebilirsiniz.
  • Tablonun silinmesi, meta verileri ve verileri sırasıyla ana düğüm ve HDFS'den siler.
  • İç tablo dosyası güvenliği yalnızca HIVE aracılığıyla kontrol edilir. Güvenliğin HIVE içinde, muhtemelen şema düzeyinde yönetilmesi gerekir (kuruluşa bağlıdır).

Hive, dahili veya harici tablolara sahip olabilir; bu, verilerin nasıl yüklendiğini, kontrol edildiğini ve yönetildiğini etkileyen bir seçimdir.

Şu durumlarda HARİCİ tabloları kullanın:

  • Veriler de Hive kullanılan dışındadır . Örneğin, veri dosyaları, dosyaları kilitlemeyen mevcut bir program tarafından okunur ve işlenir.
  • DROP TABLE sonrasında bile verilerin temel konumda kalması gerekir. Bu, tek bir veri kümesine birden çok şema (tablo veya görünüm) işaret ediyorsanız veya çeşitli olası şemalar arasında yineleme yapıyorsanız geçerli olabilir.
  • Hive veri ve kontrol ayarlarına, dizinlere vb . Sahip olmamalıdır , bunları yapacak başka bir programınız veya işleminiz olabilir.
  • Mevcut tabloyu temel alan tablo oluşturmuyorsunuz (AS SELECT).

DAHİLİ tabloları şu durumlarda kullanın:

  • Veri geçicidir .
  • Hive'ın tablonun ve verilerin yaşam döngüsünü tamamen yönetmesini istiyorsunuz .

Kaynak :

HDInsight: Hive Dahili ve Harici Tablolara Giriş

Hadoop-HIVE'da dahili ve harici tablolar


1
@CapturedTree Ama cevap doğru değil. "Hive, verileri depo dizinine taşır." -Bu tamamen yanlıştır, değil. Veriler tablo konumunda saklanıyor. Harici veya yönetilen önemli değil.
18-18

6

Depo klasöründe dahili bir tablo verisi saklanırken, tablo oluşturmada bahsettiğiniz konumda harici bir tablo verisi saklanır.

Dolayısıyla, dahili bir tabloyu sildiğinizde, şema ve depo klasörünün altındaki verileri de siler, ancak harici bir tablo için kaybedeceğiniz yalnızca şema olacaktır.

Böylece harici bir tabloyu sildikten sonra tekrar geri istediğinizde, aynı şema ile tekrar bir tablo oluşturabilir ve orijinal veri konumuna işaret edebilirsiniz. Umarım şimdi açıktır.


4

Şimdiye kadarki sınırlı araştırma ve testlerime (Hive 1.1.0 -cdh5.12.0 kullanarak) dayanan davranıştaki (amaçlanan kullanım değil) tek fark, bir tablo düştüğünde

  • Dahili (Yönetilen) tabloların verileri HDFS dosya sisteminden silinir
  • Harici tabloların verileri HDFS dosya sisteminden SİLİNMEZ.

(NOT: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL adresindeki 'Yönetilen ve Dış Tablolar' bölümüne bakın. tamamen anlamadığım diğer bazı farklılıklar listelenir)

Hive'ın tabloyu oluşturması gereken konumu yukarıdan aşağıya doğru aşağıdaki önceliğe göre seçtiğine inanıyorum.

  1. Tablo Oluşturma sırasında tanımlanan konum
  2. Tablonun oluşturulduğu Veritabanı / Şema Oluşturmada tanımlanan konum.
  3. Varsayılan Hive Depo Dizini (hive.site.xml içindeki Özellik hive.metastore.warehouse.dir)

"Bir kovan tablosunun oluşturulması" sırasında "Konum" seçeneği kullanılmadığında, yukarıdaki öncelik kuralı kullanılır. Bu hem Dahili hem de Harici tablolar için geçerlidir. Bu, bir Dahili tablonun Depo dizininde bulunması gerekmediği ve başka herhangi bir yerde bulunabileceği anlamına gelir.

Not: Bazı senaryoları kaçırmış olabilirim, ancak sınırlı keşfime dayanarak, hem Dahili hem de Dışsal tablonun davranışı, yukarıda açıklanan bir fark (veri silme) dışında aynı görünüyor. Hem Dahili hem de Harici tablolar için aşağıdaki senaryoları denedim.

  1. Konum seçeneği olan ve olmayan tablo oluşturma
  2. Bölüm Seçeneği olan ve olmayan tablo oluşturma
  3. Kovan Yükleme ve Ekleme İfadelerini kullanarak yeni veri ekleme
  4. Veri dosyalarını Hive dışındaki Tablo konumuna eklemek (HDFS komutlarını kullanarak) ve "MSCK REPAIR TABLE komutunu kullanarak tabloyu yenilemek
  5. Masaları düşürmek

güzel keşif. Bu, kovanın dahili ve harici tablo için konum seçeneğini nasıl işlediğini açıklayan tek cevaptır.
d2207197

3

Harici tablolarda, eğer onu bırakırsanız, sadece tablonun şemasını siler, tablo verileri fiziksel konumda bulunur. Verileri silmek için hadoop fs - rmr tablename kullanın. Yönetilen tablo kovanı, tablolar üzerinde tam kontrole sahip olacaktır. Harici tablolarda kullanıcılar üzerinde kontrol sahibi olacaktır.


CREATE TABLE foo (id INT) aracılığıyla oluşturulan dahili bir tabloda DROP TABLE'den sonra dizinin her zaman silinmediği bir durumla karşılaşıyorum. Görünüşe göre meta veriler tamam çünkü TABLOLARI GÖSTER tutarlı - tablo düşürüldükten sonra bu listede görünmüyor. Kafa karıştırıcı bir şekilde, bazen dir / is / silindiğini fark ettim, ancak bunu sürekli olarak yeniden oluşturamıyorum. Herhangi bir fikir?
Matthew Cornell

Tabloların izinleri kontrol ediliyor mu? HDFS'deki konumun sahipliğini farklı bir Kullanıcı olarak değiştirmiş olabilirsiniz.
Milind Jindal

1

Hive'ın silme dahil verilerinizin tüm yaşam döngüsünü yönetmesini istiyorsanız, dahili tablolar kullanışlıdır, oysa harici tablolar dosyalar Hive dışında kullanıldığında kullanışlıdır.


1

Dış kovan tablosunun, tabloları bıraktığımızda dosyaları kaldırmaması gibi avantajları vardır, serde .... sınırlandırılmış gibi farklı ayarlarla satır formatları belirleyebiliriz


1

Ayrıca Hive'ın büyük bir veri ambarı olduğunu da unutmayın. Bir tabloyu düşürmek istediğinizde, Gigabayt veya Terabaytlık veriyi kaybetmek istemezsiniz. Verilerin bu ölçekte oluşturulması, taşınması ve kopyalanması zaman alıcı olabilir. 'Yönetilen' bir tablo kovanını bıraktığınızda, verilerini de çöpe atacaktır. Bir 'Harici' tabloyu bıraktığınızda, yalnızca kovan meta deposundaki şema tanımı kaldırılır. Hdf'lerdeki veriler hala duruyor.


1

Dış Tablo için en uygun olan bu senaryoyu düşünün:

Bir MapReduce (MR) işi, nalt günlük dosyalarını (örneğin, her bir alt günlük dosyası belirli bir ileti türü günlüğü içerir) ve çıktı ie çıktısını çıkarmak için büyük bir günlük dosyasını filtreler.n alt günlük dosyaları hdfs'de depolanır.

Bu günlük dosyaları, daha fazla analitik gerçekleştirmek için Hive tablolarına yüklenecektir, bu senaryoda bir Harici Tablo (ları) tavsiye ederim, çünkü gerçek günlük dosyaları harici bir işlem tarafından oluşturulur ve sahip olunur, örneğin bir MR işi oluşturulan her günlük dosyasını ilgili Hive tablosuna yüklemek için ek bir adım.


1

Kovandaki harici bir tablonun en iyi kullanım durumu, tabloyu CSV veya metin dosyasından oluşturmak istediğiniz zamandır.


0

Hive, yalnızca meta verileri metastore'da depolar ve orijinal verileri, harici tablo kullandığımızda kovanın dışındaki orijinal verileri depolar '' bunlarla orijinal verilerimiz tabloyu düşürdüğümüzde etkilenmez


0

Halihazırda HDFS'de veri olduğunda, verileri açıklamak için harici bir Hive tablosu oluşturulabilir. Harici tablodaki veriler, varsayılan depo dizini yerine LOCATION özelliklerinde belirtildiğinden, HARİCİ olarak adlandırılır.

Verileri dahili tablolarda tutarken, Hive tablonun ve verilerin yaşam döngüsünü tam olarak yönetir. Bu, dahili tablo bırakıldığında verilerin kaldırıldığı anlamına gelir. Dış tablo bırakılırsa, tablo meta verileri silinir ancak veriler saklanır. Çoğu zaman, yanlışlıkla tablolarla birlikte verileri silmekten kaçınmak için harici bir tablo tercih edilir.


0

Hive, yönetilen tablolar için verilerinin yaşam döngüsünü kontrol eder. Hive, yönetilen tabloların verilerini varsayılan olarak hive.metastore.warehouse.dir tarafından tanımlanan dizinin altındaki bir alt dizinde depolar.

Yönetilen bir tabloyu düşürdüğümüzde, Hive tablodaki verileri siler, ancak yönetilen tablolar diğer araçlarla paylaşmak için daha az uygundur. Örneğin, öncelikle Pig tarafından oluşturulan ve kullanılan verilerimiz olduğunu varsayalım, ancak bunlara karşı bazı sorgular çalıştırmak istiyoruz, ancak verilerin sahipliğini Hive'a vermiyoruz.

O anda, bu verilere işaret eden ancak sahipliğini almayan harici tablo tanımlanır.


0

DAHİLİ : Önce Tablo oluşturulur ve Veriler daha sonra yüklenir

DIŞ : Veri olduğunu Mevcut ve Tablo edilir üstünde oluşturulan bunun.


0

Hive'da ayrıca harici bir tablo oluşturabiliriz. Hive'a, ambar dizininin dışında var olan bir konumda bulunan verilere başvurmasını söyler. Harici tabloların kaldırılması meta verileri siler ancak verileri silmez.


0

Bunu eklemek isterim

  1. Verilerin güncellenmesi gerektiğinde veya bazı satırların silinmesi gerektiğinde dahili tablolar kullanılır, çünkü ACID özellikleri Dahili tablolarda desteklenebilir, ancak ACID özellikleri harici tablolarda desteklenemez.
  2. Lütfen Dahili tablodaki verilerin yedeğinin bulunduğundan emin olun, çünkü dahili bir tablo düşürülürse veriler de kaybolur.

-2

Basit bir deyişle, iki şey var:

Hive, depodaki işleri yönetebilir, yani depodaki verileri silmez. Tabloyu sildiğimizde:

1) Dahili tablolar için veriler, depoda dahili olarak yönetilir. Böylece silinecek.

2) Harici tablolar için veriler depodan sonsuza kadar yönetilir. Yani silinemez ve kovan dışındaki istemciler de kullanabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.