Python ile BigQuery’den veri okuma ve yazma

ozan uzun
4 min readMar 11, 2022

--

Herkese merhaba,

Bu yazıda python kullanarak Bigquery’de basit SQL sorguları yazacağız,ve Bigquery’e veri yollayacağız.

Bigquery gcp’nin (Google Clould Platform) veri ambarı çözümüdür, python ile bigquery’e ulaşmak bize python teknolojilerinden faydalanmamızı sağlar. Örneğin Flask veya Django ile kurduğumuz bir web sitesinde Bigquery’de yapabileceğimiz çeşitli analizleri rahatlıkla entegre edebiliriz. Veya herhangi bir api’den Bigquery’e veri gönderimi yapabiliriz.

İşlemlere bağlamadan önce gcp ve python kurulu işletim sisteminde gerekli bir kaç düzenleme yapmamız gerekmektedir. Biz bu yazıda linux işletim sistemi üzerinde konuşacağız.

İlk olarak gcp üzerinde Bigquery için yeni bir account oluşturuyoruz. Bunun için Navigation menu > IAM & Admin > Service accounts sayfasına geçiyoruz. Burada Create service account butonuna basıyoruz.

İlk adımda account adını giriyoruz. Ve ardından create and continue butonuna basıyoruz.

İkinci adımda oluşturacağımız account’a vereceğimiz yetkiyi seçiyoruz. Biz burada BigQuery Admin yetkisi verdik.

Son adımda ise isteğe bağlı olarak kullanıcılara erişim izni veriyoruz. Ve done butonuna basıyoruz.

Account’u oluşturduktan sonra bir önceki sayfaya dönecektir. Sırada python yüklü bilgisayarımızın bigquery’e ulaşması için gerekli key’i oluşturmak var. Bunun için servislerin göründüğü email listesinde oluşturduğumuz account’un üstüne basıyoruz ve ardından açılan sayfada üst kısmında keys’e basıyoruz. Açılan sayfada add key butonunda create new key’ tıklıyoruz ve açılan pencerede json formatını seçerek create diyoruz. Key’i oluşturduğumuz an bilgisayarımıza otomatik olarak bir json dosyası indiriyor.

Şimdi pip kullanarak bigquery için gerekli kütüphaneyi indiriyoruz.

pip3 install google-cloud-bigquery

Ardından terminal üzerinde bashrc dosyasını düzenliyoruz.(nano veya vi kullanabiliriz.)

nano .bashrc

bashrc dosyasının en alt kısmına gcp için ortam değişkenini atıyoruz. Burada key’i oluşturduktan sonra indirdiğimiz json dosyasını yolunu belirtiyoruz. Ve kaydetmesi için source komutu ile .bashrc dosyasını çalıştırıyoruz.

export GOOGLE_APPLICATION_CREDENTIALS="/home/ozan/key.json"

Ardından

Şimdi Bigquery’i python üzerinden ulaşabiliriz. İlk olarak ihtiyacımız olan kütüphaneleri import ediyoruz.

from google.cloud import bigqueryimport pandas as pd

Ve ardından client nesnesini oluşturuyoruz. Burada project parametresine gcp’daki proje id’sini giriyoruz.

client=bigquery.Client(project="<proje_id>")

Şimdi client üzerinde query metotu ile basit bir sql sorgusu çalıştıralım.

sql1="SELECT * FROM `<proje_id>.test.movie` limit 5"query1=client.query(sql1)type(query1)

Çıktı:

google.cloud.bigquery.job.query.QueryJob

Mevcut sonuçları görmek için result metotu ile table1 değişkenini oluşturacağız. Ve ardından for döngüsü ile tüm sonuçları görebiliriz.

table1=query1.result()print(type(table1))print("\n")for row in table1:   print(row)print("\n")print(type(row))

Çıktı:

<class 'google.cloud.bigquery.table.RowIterator'>Row((1127, 'The Kid', 1921), {'id': 0, 'title': 1, 'year': 2})Row((1118, 'Metropolis', 1927), {'id': 0, 'title': 1, 'year': 2})Row((1051, 'City Lights', 1931), {'id': 0, 'title': 1, 'year': 2})Row((1094, 'M - Eine Stadt sucht einen Mörder', 1931), {'id': 0, 'title': 1, 'year': 2})Row((1045, 'Modern Times', 1936), {'id': 0, 'title': 1, 'year': 2})<class 'google.cloud.bigquery.table.Row'>

Sonuçlara incelediğimizde çıktıları row formatında geldiğini görüyoruz. Burada ilk olarak değerleri ve ardından bu değerlerin karşılığı olan flield’ları görüyoruz. Değerleri direk almak için kodumuzu aşağıdaki gibi düzenlemeliyiz.(Her seferinde result metotu ile tekrardan tablo1 değişkenini oluşturmalıyız aksi taktirde hata alırız.)

table1=query1.result()
print("year title")for row in table1: print(str(row.year)+" "+row.title)

Çıktı:

year title1921 The Kid1927 Metropolis1931 City Lights1931 M - Eine Stadt sucht einen Mörder1936 Modern Times

Şimdi basit bir sorgu ile tüm verileri alalım ve ardından result dışında bir kaç farklı metot deneyelim.

sql2="SELECT * FROM `<proje_id>.test.movie`"query2=client.query(sql2)

schema metotu ile çalıştırdığımız sorgudaki sonuçların şemasını görebiliriz.

table2=query2.result()schema=table2.schemaschema

Çıktı:

[SchemaField('id', 'INTEGER', 'NULLABLE', None, (), None),SchemaField('title', 'STRING', 'NULLABLE', None, (), None),SchemaField('year', 'INTEGER', 'NULLABLE', None, (), None)]

total_rows ile sorgu sonucunun toplam sayısını görebiliriz.

table2.total_rows

to_dataframe metotu ile verileri bir pandas dataframe’e dönüştürebiliriz.

df=query2.result().to_dataframe()df.head()

Çıktı:

Şimdi bir birkaç veri ekleyelim. Bunun ilk olarak için insert_rows_json metotunu kullanabiliriz. Burada table parametresine tablonun ismini giriyoruz. json_rows parametresine ise json verilerimizi giriyoruz.

movie_list=[{u"id":1200,u"title":"Dune",u"year":2021},{u"id":1201,u"title":"Moon Fall",u"year":2022}]client.insert_rows_json(table="<proje_id>.test.movie",json_rows=movie_list)

Eğer bir hata almazsak sonuç olarak boş bir liste “[]” döner.

Şimdi bir pandas dataframe’ini ekleyelim.

movie_df=pd.read_csv("movie.csv")movie_df.head()
client.insert_rows_from_dataframe(table="<proje_id>.test.movie",dataframe=movie_df,selected_fields=schema)

Burada dataframe parametresine dataframe ismini ,selected_fields ise uygun şemayı giriyoruz. Burada daha kolaylık olması açısında daha önceden aldığımız şemayı belirliyoruz. Eğer hata almazsak çıktı olarak iç içe geçmiş liste“[[]]” dönecektir.

Bu yazıda kullandığımız kodları bu link üzerinden bigquary-beginner adlı jupyter notebook’da bulabilirsiniz. Ayrıca aynı link üzerinden verileri(movie.csv,ironman.csv) csv formatında indirebilirsiniz.

--

--