2016-03-24 21 views
2

GGS'de bazı CSV dosyalarını işaret eden birleşik bir kaynağım var.BigQuery federe tablosunu Dataflow içinde kaynak olarak okuma Bir hata atar

1226 [main] ERROR com.google.cloud.dataflow.sdk.util.BigQueryTableRowIterator - Error reading from BigQuery table Federated_test_dataflow of dataset CPT_7414_PLAYGROUND : 400 Bad Request 
{ 
    "code" : 400, 
    "errors" : [ { 
    "domain" : "global", 
    "message" : "Cannot list a table of type EXTERNAL.", 
    "reason" : "invalid" 
    } ], 
    "message" : "Cannot list a table of type EXTERNAL." 
} 

mu Dataflow BigQuery'de federe kaynaklarını desteklemek, veya yanlış bir şey yapıyorum değil:

Ben Dataflow boru hattı için bir kaynak olarak federe BigQuery masaya okumaya çalışın, aşağıdaki hata atıyor ? GCS'deki dosyaları doğrudan benim boru hattımda okuyabileceğimi biliyorum, ancak uygulamanın tasarımı nedeniyle BigQuery TableRow nesneleriyle çalışmayı tercih ederim.

PCollection<TableRow> results = pipeline.apply("fed-test", BigQueryIO.Read.from("<project_id>:CPT_7414_PLAYGROUND.Federated_test_dataflow")).apply(ParDo.of(new DoFn<TableRow, TableRow>() { 
     @Override 
     public void processElement(ProcessContext c) throws Exception { 
      System.out.println(c.element()); 
     } 
    })); 
+0

Hangi koşucuyu kullanıyorsunuz? "DirectPipelineRunner", "DataflowPipelineRunner" veya "BlockingDataflowPipelineRunner"? –

+0

DirectPipelineRunner –

+0

@polleyg Yardım ederse başka bir yanıt daha ekledik. –

cevap

2

Michael'in dediği gibi, BigQuery doğrudan DIŞ CEPHE (federe tabloları) veya VIEW'ları okumayı desteklemez: okuma bile etkili bir şekilde sorgu alır. Dataflow, bu tablolardan okumak için

, bunun yerine sorgu vermek ve geçici tabloya sonucu kaydedin ve sonra okuma süreci başlayacak

BigQueryIO.Read.fromQuery("SELECT * FROM table_or_view_name") 

kullanabilirsiniz. Tabii ki, bu, BigQuery'de sorgulama masraflarına neden olacaktır, bu yüzden aynı VIEW'dan veya EXTERNAL tablosundan tekrar tekrar okumak isterseniz, tabloyu manuel olarak oluşturmak isteyebilirsiniz.

4

Dataflow BigQuery kaynağı, "TABLE" türünde BigQuery yönetilen tablolarını okumak için tasarlanmıştır. (Tür tanımı https://cloud.google.com/bigquery/docs/reference/v2/tables#type'da bulunabilir.) HARİCİ ve GÖRÜNÜM tabloları desteklenmez.

BigQuery "federe tablo" özelliği, bigquery'nin Google Cloud Storage gibi yerlerde bulunan verileri doğrudan sorgulamasına izin verir. Dataflow, Google Cloud Storage'daki dosyaları da okuyabilir. Bu nedenle, Veri Akışı hesaplamalarınızı, okumak istediğiniz kaynaklarda doğrudan yönlendirebilmeniz gerekir.

+1

Dataflow'un BigQuery'den okuma görünümlerini veya federe kaynakları desteklemediği bir yerde belgelendi mi? Doğru, benim yazımda söylediğim gibi, doğrudan GCS'den okuyabildiğimi biliyorum, ancak uygulamanın tasarımını tutarlı bir şekilde tutabilmek ve BigQuery TableRow ile çalışmayı tercih ederim. –

+1

Bu gerçekten temel bir Dataflow sorunu değildir: BigQuery'nin API'lerinin (çok makul) bir sınırlamasıdır. Dataflow uyarısının daha iyi gösterilmesini sağlamak için https://issues.apache.org/jira/browse/BEAM-174 adresine başvurdum. '' (Tablo) 'komutunu bir' fromQuery (“tablodan * seçin”) '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'otomatik olarak çevirebilmemize rağmen, kullanıcıların bilerek sorgulama maliyetine dahil olmamasını tercih etmedik. –