2016-08-16 18 views
6

Mam duże pliki CSV i pliki Excel, w których je czytam i dynamicznie utworzę potrzebny skrypt tabeli tworzenia, w zależności od pól i typów, jakie ma. Następnie wstaw dane do utworzonej tabeli.Wprowadzanie dużej ilości danych do BigQuery za pośrednictwem biblioteki BigQuery-Pythona

Przeczytałem this i zrozumiałem, że powinienem wysłać je z jobs.insert() zamiast tabledata.insertAll() dla dużej ilości danych.

Tak to nazywam (działa dla mniejszych plików, nie dużych).

result = client.push_rows(datasetname,table_name,insertObject) # insertObject is a list of dictionaries 

Kiedy używam biblioteki push_rows, powoduje to błąd w oknach.

[Errno 10054] An existing connection was forcibly closed by the remote host 

i to w ubuntu.

[Errno 32] Broken pipe 

Więc kiedy poszedłem za pośrednictwem kodu BigQuery-Python używa table_data.insertAll().

Jak mogę to zrobić w tej bibliotece? Wiem, że możemy przesyłać pliki z Google, ale potrzebuję metody bezpośredniego przesyłania.

Odpowiedz

2

Podczas obsługi dużych plików nie należy korzystać z przesyłania strumieniowego, ale ładowanie wsadowe: przesyłanie strumieniowe może z łatwością obsłużyć do 100 000 wierszy na sekundę. To całkiem dobre do przesyłania strumieniowego, ale nie do ładowania dużych plików.

Połączony kod przykładowy działa dobrze (wsad zamiast przesyłania strumieniowego), więc widzimy inny problem: ten przykładowy kod próbuje załadować wszystkie te dane bezpośrednio do BigQuery, ale przesyłanie za pośrednictwem części POST kończy się niepowodzeniem . gsutil ma bardziej odporny algorytm przesyłania niż zwykły POST.

Rozwiązanie: Zamiast ładowania dużych porcji danych za pośrednictwem POST, najpierw wykonaj te czynności w Google Cloud Storage, a następnie powiedz BigQuery, aby odczytywał pliki z GCS.

Zobacz także BigQuery script failing for large file

+0

Czy wystarczy dodać link do PO ?! –

+1

oops, naprawianie rekursji! –

+0

@FelipeHoffa gsutil mogę używać wewnątrz kodu Pythona? Wystąpiły problemy z typami kolumn, gdy bezpośrednio podajesz ścieżkę pliku CSV i przesyłasz. dzięki czemu mogę odczytać CSV i odpowiednio obsadzić pola. Czy nie istnieje sposób wstawienia obiektu (może to być lista słowników) do tabeli po ich przesłaniu? –

Powiązane problemy