2015-12-03 16 views
8

Bir veri kümesinin sortPartition yöntemi, belirtilen bazı alanlara göre yerel olarak veri kümesini sıralar. Flink'te global olarak sıralanmış büyük Veri kümemi nasıl verimli bir şekilde alabilirim?Genel sıralama, Apache Flink

cevap

12

Flink, henüz yerleşik bir aralık bölümleme stratejisi sağlanmadığından, bu durum şu anda kolayca mümkün değildir.

A-etrafında çalışma özel bir Partitioner uygulamaktır

:

DataSet<Tuple2<Long, Long>> data = ... 
data 
    .partitionCustom(new Partitioner<Long>() { 
    int partition(Long key, int numPartitions) { 
     // your implementation 
    } 
    }, 0) 
    .sortPartition(0, Order.ASCENDING) 
    .writeAsText("/my/output"); 

Not: Özel bir bölümleyici ile dengelenmiş bölümleri elde etmek için, anahtarının değeri aralığı ve dağılımı hakkında bilmeniz gereken .

Apache'de bir aralık bölümleyici (otomatik örnekleme ile) desteği şu anda work in progress ve yakında kullanıma hazır olmalıdır.

Düzenleme (Haziran 7th, 2016): Aralık bölümlemesi Apache Flink'e 1.0.0 sürümü ile eklenmiştir. aşağıdaki gibi küresel sıralama veri ayarlayabilirsiniz: numuneleri eşit büyüklükteki bölümleri için bir veri dağılımının hesaplanmasını set giriş verileri bölümleme aralığı

DataSet<Tuple2<Long, Long>> data = ... 
data 
    .partitionByRange(0) 
    .sortPartition(0, Order.ASCENDING) 
    .writeAsText("/my/output"); 

Not.

+0

1- Veri kümesinde herhangi bir bilgi yoksa, bunları nasıl bölümleyebiliriz? 2- Bunu yapmanın bir yolunu bulduk. Bu komut, genel bir sıralanmış veri kümesi çıktı mı? –

+0

1) Bu iyi bir nokta. Özel bir bölümleyici uygularsanız, dengeli bölümler elde etmek için anahtarın değer aralığını ve dağıtımını bilmelisiniz. Bağlantılı çekme isteğindeki aralık bölümleyici, bir dağılım elde etmek için verileri otomatik olarak örneklendirir. 2) Evet, bölümleri ayırır ve her bir bölümü aynı tuşta sıralarsanız, çıktı genel olarak sıralanır. –

İlgili konular