Sprawdzanie finansowania kampanii za pomocą BigQuery

Z tego modułu dowiesz się, jak korzystać z zaawansowanych funkcji BigQuery, takich jak:

  • Funkcje zdefiniowane przez użytkownika w kodzie JavaScript
  • Tabele partycjonowane
  • Bezpośrednie zapytania do danych przechowywanych w Google Cloud Storage i na Dysku Google.

Przejmiesz dane Federalnej Komisji Wyborczej USA, wyczyść dane i załadujesz je w BigQuery. Masz też możliwość zadania ciekawych pytań dotyczących tego zbioru danych.

Nie będziemy zakładać, że masz już doświadczenie w korzystaniu z BigQuery, ale niektóre informacje o SQL pomogą Ci go jak najlepiej wykorzystać.

Czego się nauczysz

  • Jak używać funkcji zdefiniowanych przez użytkownika JavaScript do wykonywania działań, które są trudne do wykonania w SQL.
  • Jak używać BigQuery do wykonywania operacji ETL (wyodrębnianie, przekształcanie, wczytywanie) danych znajdujących się w innych magazynach danych, takich jak Google Cloud Storage czy Dysk Google.

Czego potrzebujesz

  • Projekt Google Cloud z włączonymi płatnościami.
  • Zasobnik Google Cloud Storage
  • Zainstalowano pakiet SDK Google Cloud

Jak będziesz korzystać z tego samouczka?

Przeczytaj tylko Przeczytaj i wykonaj ćwiczenia

Jak oceniasz swoje doświadczenie z BigQuery?

Początkujący Średnio zaawansowany Zaawansowany

Konfiguracja środowiska we własnym tempie

Jeśli nie masz jeszcze konta Google (Gmail lub Google Apps), musisz je utworzyć. Zaloguj się w konsoli Google Cloud Platform (console.cloud.google.com) i utwórz nowy projekt:

Zrzut ekranu z 10 września 2016 r., 12:45:26.png

Zapamiętaj identyfikator projektu, unikalną nazwę we wszystkich projektach Google Cloud (powyższa nazwa została już użyta i nie będzie działać). W ćwiczeniach nazywamy je później PROJECT_ID.

Aby móc używać zasobów Google Cloud, musisz najpierw włączyć płatności w Cloud Console.

Ćwiczenia z programowania nie powinny kosztować więcej niż kilka dolarów, ale mogą być większe, jeśli zdecydujesz się wykorzystać więcej zasobów lub pozostawisz to uruchomione (zobacz sekcję „Czyszczenie” na końcu tego dokumentu).

Nowi użytkownicy Google Cloud Platform mogą skorzystać z bezpłatnej wersji próbnej o wartości 300 USD.

Google Cloud Shell,

Google Cloud i BigQuery można wykonywać zdalnie z laptopa, ale w trakcie naszych ćwiczeń z programowania będziemy używać Google Cloud Shell – środowiska wiersza poleceń działającego w chmurze.

Ta maszyna wirtualna oparta na Debianie jest wyposażona we wszystkie potrzebne narzędzia dla programistów. Oferuje trwały katalog domowy o pojemności 5 GB oraz działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelnianie. Oznacza to, że do wykonania tych ćwiczeń z programowania wystarczy przeglądarka (tak, to działa na Chromebooku).

Aby aktywować Google Cloud Shell, w konsoli administracyjnej kliknij przycisk w prawym górnym rogu ekranu. Udostępnienie środowiska i połączenie się z nim powinno potrwać kilka minut:

aktywujCloudShell.png

Kliknij przycisk „Rozpocznij” w Cloud Shell:

Zrzut ekranu 2017-06-14 at 22.13.43 PM.png

Po połączeniu z Cloud Shell zobaczysz, że uwierzytelniono już projekt, a w projekcie ustawiono już PROJECT_ID :

gcloud auth list

Polecenie wyjściowe

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Polecenie wyjściowe

[core]
project = <PROJECT_ID>

Cloud Shell domyślnie ustawia też niektóre zmienne środowiskowe, co może być przydatne podczas uruchamiania kolejnych poleceń.

echo $GOOGLE_CLOUD_PROJECT

Polecenie wyjściowe

<PROJECT_ID>

Jeśli z jakiegoś powodu projekt nie jest skonfigurowany, uruchom to polecenie :

gcloud config set project <PROJECT_ID>

Szukasz urządzenia PROJECT_ID? Sprawdź identyfikator użyty w procesie konfiguracji lub znajdź go w panelu konsoli:

Identyfikator_projektu.png

WAŻNE: ustaw domyślną strefę i konfigurację projektu:

gcloud config set compute/zone us-central1-f

Możesz wybrać różne strefy. Więcej informacji znajdziesz w dokumentacji regionów i stref.

Aby uruchamiać zapytania BigQuery w ramach tego ćwiczenia z programowania, musisz mieć własny zbiór danych. Wybierz dla niego nazwę, na przykład campaign_funding. Uruchom następujące polecenia w powłoce (na przykład CloudShell):

$ DATASET=campaign_funding
$ bq mk -d ${DATASET}
Dataset 'bq-campaign:campaign_funding' successfully created.

Gdy zbiór danych zostanie utworzony, możesz rozpocząć pracę. Uruchomienie tego polecenia powinno pomóc Ci sprawdzić, czy konfiguracja klienta klienta wiersza poleceń bq została poprawnie skonfigurowana, czy uwierzytelnianie działa i czy masz uprawnienia do zapisu w projekcie w chmurze, w którym pracujesz. Jeśli masz więcej niż jeden projekt, pojawi się prośba o wybranie z listy tego, który Cię interesuje.

Zrzut ekranu 2016-03-14 at 9.16.49 PM.png

Zbiór danych kampanii Federalnej Komisji Wyborczej (Federal Election Commission) finansów w USA został zdekompresowany i skopiowany do zasobnika GCS gs://campaign-funding/.

Pobierzmy jeden z plików źródłowych lokalnie, abyśmy mogli zobaczyć, jak to wygląda. Uruchom następujące polecenia w oknie wiersza polecenia:

$ gsutil cp gs://campaign-funding/indiv16.txt .
$ tail indiv16.txt

Powinna wyświetlić się zawartość pliku z treściami dotyczącymi publikowanych treści. Są 3 rodzaje plików, które będziemy omawiać w ćwiczeniach z programowania: indywidualne zadania (indiv*.txt), kandydaci (cn*.txt) i komitety (cm*.txt). Jeśli chcesz, użyj tego samego mechanizmu, by sprawdzić ich zawartość.

Nie będziemy wczytywać nieprzetworzonych danych bezpośrednio w BigQuery, tylko wysłać je do Google Cloud Storage. Aby to zrobić, musimy znać schemat i kilka informacji o nim.

Zbiór danych opisano na stronie dotyczącej wyborów. Oto schematy tabel, które będziemy oglądać:

Aby utworzyć link do tabel, musisz utworzyć dla nich definicję tabeli zawierającą schematy. Aby wygenerować definicje poszczególnych tabel, uruchom następujące polecenia:

$ bq mkdef --source_format=CSV \
    gs://campaign-funding/indiv*.txt \
"CMTE_ID, AMNDT_IND, RPT_TP, TRANSACTION_PGI, IMAGE_NUM, TRANSACTION_TP, ENTITY_TP, NAME, CITY, STATE, ZIP_CODE, EMPLOYER, OCCUPATION, TRANSACTION_DT, TRANSACTION_AMT:FLOAT, OTHER_ID, TRAN_ID, FILE_NUM, MEMO_CD, MEMO_TEXT, SUB_ID" \
> indiv_def.json

Otwórz plik indiv_dev.json w ulubionym edytorze tekstu i przyjrzyj się jego zawartości. Będzie on zawierać plik JSON z opisem sposobu interpretowania pliku danych FEC.

Musimy wprowadzić dwie drobne zmiany w sekcji csvOptions. Dodaj wartość fieldDelimiter „"|"” i wartość quote "" (pusty ciąg znaków). Jest to niezbędne, ponieważ plik danych nie jest w rzeczywistości rozdzielany przecinkami, a jest oddzielony pionową kreską:

$ sed -i 's/"fieldDelimiter": ","/"fieldDelimiter": "|"/g; s/"quote": "\\""/"quote":""/g' indiv_def.json

Plik indiv_dev.json powinien teraz wyglądać tak :

    "fieldDelimiter": "|", 
    "quote":"", 

Definicje tabel komitetu i tabel kandydatów są podobne, a schemat zawiera przyzwoity schemat, wystarczy tylko pobrać te pliki.

$ gsutil cp gs://campaign-funding/candidate_def.json .
Copying gs://campaign-funding/candidate_def.json...
/ [1 files][  945.0 B/  945.0 B]                                                
Operation completed over 1 objects/945.0 B. 

$ gsutil cp gs://campaign-funding/committee_def.json .
Copying gs://campaign-funding/committee_def.json...
/ [1 files][  949.0 B/  949.0 B]                                                
Operation completed over 1 objects/949.0 B.  

Te pliki będą wyglądać podobnie do pliku indiv_dev.json. Możesz też pobrać plik indiv_def.json na wypadek problemów z uzyskaniem odpowiednich wartości.

Teraz musimy połączyć tabelę BigQuery z tymi plikami. Uruchom te polecenia:

$ bq mk --external_table_definition=indiv_def.json -t ${DATASET}.transactions 
Table 'bq-campaign:campaign_funding.transactions' successfully created.

$ bq mk --external_table_definition=committee_def.json -t ${DATASET}.committees 
Table 'bq-campaign:campaign_funding.committees' successfully created.

$ bq mk --external_table_definition=candidate_def.json -t ${DATASET}.candidates 
Table 'bq-campaign:campaign_funding.candidates' successfully created.

Spowoduje to utworzenie 3 tabel BigQuery: transakcje, komitety i kandydatów. Możesz tworzyć zapytania do tych tabel, tak jak w przypadku zwykłych tabel BigQuery, ale nie są one przechowywane w BigQuery, tylko w Google Cloud Storage. Jeśli zaktualizujesz pliki bazowe, zmiany te zostaną natychmiast odzwierciedlone w uruchamianych zapytaniach.

Teraz spróbujmy uruchomić kilka zapytań. Otwórz interfejs internetowy BigQuery.

select-bq.png

Odszukaj swój zbiór danych w panelu nawigacji po lewej stronie (może być konieczne zmianę menu projektu w lewym górnym rogu), kliknij duży czerwony przycisk „UTWÓRZ ZAPYTANIE” i wpisz w polu następujące zapytanie:

SELECT * FROM [campaign_funding.transactions] 
WHERE EMPLOYER contains "GOOGLE" 
ORDER BY TRANSACTION_DT DESC
LIMIT 100

W ten sposób otrzymasz 100 ostatnich darowizn na kampanię od pracowników Google. Jeśli chcesz, możesz spróbować poszukać darowizn na rzecz kampanii od osób z Twojego kodu pocztowego lub znaleźć największe darowizny w Twoim mieście.

Zapytanie i wyniki będą wyglądać mniej więcej tak:

Zrzut ekranu 2016-03-14 o 21:31.58.png

Można jednak zauważyć, że odbiorcy nie są w stanie rozróżnić odbiorców tych darowizn. Aby znaleźć te informacje, musimy opracować bardziej zaawansowane zapytania.

W tabeli po lewej stronie kliknij tabelę transakcji, a następnie kartę schematów. Powinno to wyglądać mniej więcej tak:

Zrzut ekranu 2016-03-14 o 21:43.04.png

Widzimy listę pól, które pasują do zdefiniowanej wcześniej tabeli. Możesz zauważyć, że nie ma pola odbiorcy, a w jakikolwiek sposób możesz sprawdzić, kto kandyduje w ramach darowizny. Jednak jest pole o nazwie CMTE_ID. Umożliwi nam to połączenie komisji, która otrzymała darowiznę. To jeszcze nie jest przydatne.

Następnie kliknij tabelę komitetów, aby sprawdzić jej schemat. Mamy znak CMET_ID, który umożliwia dołączenie do tabeli transakcji. Inne pole to CAND_ID – można je połączyć z tabelą CAND_ID w tabeli kandydatów. Na koniec prezentujemy powiązanie między transakcjami a kandydatami poprzez tabelę komitetów.

Pamiętaj, że w tabelach opartych na GCS nie ma karty podglądu. Wynika to z tego, że aby odczytać dane, BigQuery musi odczytywać dane z zewnętrznego źródła danych. Aby zobaczyć próbkę danych, uruchom proste zapytanie „SELECT *' w tabeli kandydatów.

SELECT * FROM [campaign_funding.candidates]
LIMIT 100

Wynik powinien wyglądać mniej więcej tak:

Zrzut ekranu 2016-03-14 o 21:45.52.png

Możesz zauważyć, że imiona i nazwiska kandydatów są WIELKIE WIELKIE LITERY Trochę to irytujące, ponieważ to nie jest takie, jakie uważamy za kandydatów. Wolimy widzieć „Barack Obama” niż „OBAMA, BARACK&quot”. Co więcej, daty transakcji (TRANSACTION_DT) w tabeli transakcji też są niezrozumiałe. Są to wartości w formacie YYYYMMDD. W następnej sekcji rozwiążemy te problemy.

Skoro już rozumiemy, jak transakcje dotyczą kandydatów, możemy przeprowadzić zapytanie, by określić, komu chcą przekazać pieniądze. Skopiuj i wklej następujące zapytanie w oknie tworzenia wiadomości:

SELECT affiliation, SUM(amount) AS amount
FROM (
  SELECT *
  FROM (
    SELECT
      t.amt AS amount,
      t.occupation AS occupation,
      c.affiliation AS affiliation,
    FROM (
      SELECT
        trans.TRANSACTION_AMT AS amt,
        trans.OCCUPATION AS occupation,
        cmte.CAND_ID AS CAND_ID
      FROM [campaign_funding.transactions] trans
      RIGHT OUTER JOIN EACH (
        SELECT
          CMTE_ID,
          FIRST(CAND_ID) AS CAND_ID
        FROM [campaign_funding.committees]
        GROUP EACH BY CMTE_ID ) cmte
      ON trans.CMTE_ID = cmte.CMTE_ID) AS t
    RIGHT OUTER JOIN EACH (
      SELECT
        CAND_ID,
        FIRST(CAND_PTY_AFFILIATION) AS affiliation,
      FROM [campaign_funding.candidates]
      GROUP EACH BY CAND_ID) c
    ON t.CAND_ID = c.CAND_ID )
  WHERE occupation CONTAINS "ENGINEER")
GROUP BY affiliation
ORDER BY amount DESC

To zapytanie dołączy tabelę transakcji do tabeli komitetów, a następnie do tabeli kandydatów. Sprawdza tylko transakcje wykonane przez osoby ze słowem „ENGINEER” w stanowisku pracy. Zapytanie agreguje wyniki według przynależności do partii. Dzięki temu możemy zobaczyć, jak przekazywane są darowizny na rzecz różnych partii politycznych wśród inżynierów.

Zrzut ekranu 2016-03-14 o 21:56.37.png

Widzimy, że inżynierów jest dość zrównoważony zespół, który czyni demokratów i republikanów mniej więcej równomiernie. Ale czym jest grupa DFL&#39? Czy lepiej byłoby uzyskać pełne imiona i nazwiska, a nie tylko trzyliterowy kod?

Kody podmiotów są zdefiniowane na stronie FEC. Jest tabela, która pasuje do pełnego kodu grupy (okazuje się, że „DFL' to „Democratic-Farmer-Labor'”). Ręczne tłumaczenie udało nam się wykonać w zapytaniu, ale wygląda to na bardzo pracochłonne i trudne w synchronizowaniu.

Co w sytuacji, gdy w odpowiedzi na zapytanie możemy przeanalizować kod HTML? Kliknij prawym przyciskiem myszy dowolne miejsce na tej stronie i sprawdź &wyświetl źródło strony. W źródle znajduje się wiele potrzebnych informacji, ale znajdź tag <table>. Każdy wiersz mapowania znajduje się w elemencie HTML <tr>. Nazwa i kod są spakowane w elementach <td>. Każdy wiersz będzie wyglądać mniej więcej tak:

Kod HTML wygląda mniej więcej tak:

<tr bgcolor="#F5F0FF">
    <td scope="row"><div align="left">ACE</div></td>
    <td scope="row">Ace Party</td>
    <td scope="row"></td>
</tr>

Pamiętaj, że BigQuery nie może odczytać pliku bezpośrednio z internetu. Wynika to z faktu, że BigQuery może korzystać ze źródła z tysiącami instancji roboczych jednocześnie. Gdyby taka strona mogła działać w przypadku losowych stron internetowych, zasadniczo jest to rozproszona odmowa usługi (DDoS). Plik HTML ze strony FEC jest przechowywany w zasobniku gs://campaign-funding.

Musimy utworzyć tabelę na podstawie danych o finansowaniu kampanii. Będzie ona podobna do innych tabel obsługiwanych przez GCS. Różnica polega na tym, że nie mamy schematu. Będziemy używać tylko jednego pola w wierszu i nazwić go „data'”. Uwierzymy, że jest to plik CSV z cudzysłowem (`) i bez znaków cudzysłowu.

Aby utworzyć tabelę wyszukiwania partii, uruchom następujące polecenia z wiersza poleceń:

$ echo '{"csvOptions": {"allowJaggedRows": false, "skipLeadingRows": 0, "quote": "", "encoding": "UTF-8", "fieldDelimiter": "`", "allowQuotedNewlines": false}, "ignoreUnknownValues": true, "sourceFormat": "CSV", "sourceUris": ["gs://campaign-funding/party_codes.shtml"], "schema": {"fields": [{"type": "STRING", "name": "data"}]}}' > party_raw_def.json
$ bq mk --external_table_definition=party_raw_def.json \
   -t ${DATASET}.raw_party_codes 
Table 'bq-campaign:campaign_funding.raw_party_codes' successfully created.

Do analizy pliku użyjemy JavaScriptu. W prawym górnym rogu edytora zapytań BigQuery powinien być przycisk z tekstem „Edytor UDF”. Kliknij go, aby przejść do edytowania UDF pliku w języku JavaScript. Edytor UDF zostanie wypełniony kilkoma komentarzami.

Zrzut ekranu 2016-03-14 at 22.00.38 PM.png

Usuń kod, który się w nim znajduje, i wpisz ten kod:

function tableParserFun(row, emitFn) {
  if (row.data != null && row.data.match(/<tr.*<\/tr>/) !== null) {
    var txt = row.data
    var re = />\s*(\w[^\t<]*)\t*<.*>\s*(\w[^\t<]*)\t*</;
    matches = txt.match(re);
    if (matches !== null && matches.length > 2) {
        var result = {code: matches[1], name: matches[2]};
        emitFn(result);
    } else {
        var result = { code: 'ERROR', name: matches};
        emitFn(result);
    }
  }
}

bigquery.defineFunction(
  'tableParser',               // Name of the function exported to SQL
  ['data'],                    // Names of input columns
  [{'name': 'code', 'type': 'string'},  // Output schema
   {'name': 'name', 'type': 'string'}],
  tableParserFun // Reference to JavaScript UDF
);

Kod JavaScript jest tutaj podzielony na dwa elementy. Pierwsza to funkcja, która pobiera wiersz z danymi analizowane przez analizowane dane wyjściowe. Druga to definicja, która służy jako funkcja zdefiniowana przez użytkownika (UDF) o nazwie tableParser i wskazuje, że pobiera ona kolumnę wejściową o nazwie „data&#39” oraz zwraca 2 kolumny: kod i nazwę. Kolumna kodu będzie zawierać trzyliterowy kod i nazwę grupy.

Wróć do &&;zapytania w Edytorze zapytań i wpisz to zapytanie:

SELECT code, name FROM tableParser([campaign_funding.raw_party_codes])
ORDER BY code

Uruchomienie tego zapytania przeanalizuje nieprzetworzony plik HTML i wygeneruje wartości pól w uporządkowanym formacie. Świetna robota, prawda? Sprawdź, co oznacza ten skrót „DFL'”.

Teraz, gdy potrafimy przetłumaczyć kody na strony na podstawie nazw, spróbujmy wyszukać coś innego za pomocą tego zapytania. Uruchom następujące zapytanie:

SELECT
  candidate,
  election_year,
  FIRST(candidate_affiliation) AS affiliation,
  SUM(amount) AS amount
FROM (
  SELECT 
    CONCAT(REGEXP_EXTRACT(c.candidate_name,r'\w+,[ ]+([\w ]+)'), ' ',
      REGEXP_EXTRACT(c.candidate_name,r'(\w+),')) AS candidate,
    pty.candidate_affiliation_name AS candidate_affiliation,
    c.election_year AS election_year,
    t.amt AS amount,
  FROM (
    SELECT
      trans.TRANSACTION_AMT AS amt,
      cmte.committee_candidate_id AS committee_candidate_id
    FROM [campaign_funding.transactions] trans
    RIGHT OUTER JOIN EACH (
      SELECT
        CMTE_ID,
        FIRST(CAND_ID) AS committee_candidate_id
      FROM [campaign_funding.committees]
      GROUP BY CMTE_ID ) cmte
    ON trans.CMTE_ID = cmte.CMTE_ID) AS t
  RIGHT OUTER JOIN EACH (
    SELECT
      CAND_ID AS candidate_id,
      FIRST(CAND_NAME) AS candidate_name,
      FIRST(CAND_PTY_AFFILIATION) AS affiliation,
      FIRST(CAND_ELECTION_YR) AS election_year,
    FROM [campaign_funding.candidates]
    GROUP BY candidate_id) c
  ON t.committee_candidate_id = c.candidate_id
  JOIN (
    SELECT
      code,
      name AS candidate_affiliation_name
    FROM (tableParser([campaign_funding.raw_party_codes]))) pty
  ON pty.code = c.affiliation )
GROUP BY candidate, election_year
ORDER BY amount DESC
LIMIT 100

To zapytanie pokaże, którzy kandydaci zdobyli największe darowizny na potrzeby kampanii, i przedstawicie swój związek.

Te tabele nie są bardzo duże i zabierają około 30 sekund. Jeśli będziesz przeprowadzać dużo pracy z tabelami, prawdopodobnie zechcesz zaimportować je do BigQuery. Możesz uruchomić zapytanie ETL w tabeli, aby skonwertować dane do postaci łatwej w użyciu, a potem zapisać ją jako tabelę stałą. Oznacza to, że nie musisz pamiętać o tłumaczeniu kodów grupy i odfiltrowywać błędne dane.

Kliknij przycisk „Pokaż opcje”, a następnie przycisk „Wybierz tabelę” obok etykiety „Destination Table"”. Wybierz zbiór danych campaign_funding i wpisz identyfikator tabeli jako „summary'”. Zaznacz pole wyboru „allow large results'”.

Teraz uruchom to zapytanie:

SELECT 
CONCAT(REGEXP_EXTRACT(c.candidate_name,r'\w+,[ ]+([\w ]+)'), ' ', REGEXP_EXTRACT(c.candidate_name,r'(\w+),')) 
  AS candidate,
pty.candidate_affiliation_name as candidate_affiliation,
INTEGER(c.election_year) as election_year,
c.candidate_state as candidate_state,
c.office as candidate_office,
t.name as name,
t.city as city,
t.amt as amount,
c.district as candidate_district,
c.ici as candidate_ici,
c.status as candidate_status,

t.memo as memo,
t.state as state,
LEFT(t.zip_code, 5) as zip_code,
t.employer as employer,
t.occupation as occupation,
USEC_TO_TIMESTAMP(PARSE_UTC_USEC(
CONCAT(RIGHT(t.transaction_date, 4), "-", 
      LEFT(t.transaction_date,2), "-", 
      RIGHT(LEFT(t.transaction_date,4), 2),
      " 00:00:00"))) as transaction_date,
t.committee_name as committee_name,
t.committe_designation as committee_designation,
t.committee_type as committee_type,
pty_cmte.committee_affiliation_name as committee_affiliation,
t.committee_org_type as committee_organization_type,
t.committee_connected_org_name as committee_organization_name,
t.entity_type as entity_type,
FROM (
SELECT 
trans.ENTITY_TP as entity_type,
trans.NAME as name,
trans.CITY as city,
trans.STATE as state,
trans.ZIP_CODE as zip_code,
trans.EMPLOYER as employer,
trans.OCCUPATION as occupation,
trans.TRANSACTION_DT as transaction_date,
trans.TRANSACTION_AMT as amt,
trans.MEMO_TEXT as memo,
cmte.committee_name as committee_name,
cmte.committe_designation as committe_designation,
cmte.committee_type as committee_type,
cmte.committee_affiliation as committee_affiliation,
cmte.committee_org_type as committee_org_type,
cmte.committee_connected_org_name as committee_connected_org_name,
cmte.committee_candidate_id as committee_candidate_id
FROM [campaign_funding.transactions] trans
RIGHT OUTER JOIN EACH (
SELECT
CMTE_ID,
FIRST(CMTE_NM) as committee_name,
FIRST(CMTE_DSGN) as committe_designation,
FIRST(CMTE_TP) as committee_type,
FIRST(CMTE_PTY_AFFILIATION) as committee_affiliation,
FIRST(ORG_TP) as committee_org_type,
FIRST(CONNECTED_ORG_NM) as committee_connected_org_name,
FIRST(CAND_ID) as committee_candidate_id
FROM [campaign_funding.committees]
GROUP BY CMTE_ID
) cmte 
ON trans.CMTE_ID = cmte.CMTE_ID) as t
RIGHT OUTER JOIN EACH 
  (SELECT CAND_ID as candidate_id,
      FIRST(CAND_NAME) as candidate_name,
      FIRST(CAND_PTY_AFFILIATION) as affiliation,
      INTEGER(FIRST(CAND_ELECTION_YR)) as election_year,
      FIRST(CAND_OFFICE_ST) as candidate_state,
      FIRST(CAND_OFFICE) as office,
      FIRST(CAND_OFFICE_DISTRICT) as district,
      FIRST(CAND_ICI) as ici,
      FIRST(CAND_STATUS) as status,
   FROM  [campaign_funding.candidates]
   GROUP BY candidate_id) c 
ON t.committee_candidate_id = c.candidate_id
JOIN (
SELECT code, name as candidate_affiliation_name 
FROM (tableParser([campaign_funding.raw_party_codes]))) pty
ON pty.code = c.affiliation
JOIN (
SELECT code, name as committee_affiliation_name 
FROM (tableParser([campaign_funding.raw_party_codes]))) pty_cmte
ON pty_cmte.code = t.committee_affiliation
WHERE t.amt > 0.0 and REGEXP_MATCH(t.state, "^[A-Z]{2}$") and t.amt < 1000000.0

To zapytanie jest znacznie dłuższe i ma więcej opcji czyszczenia. Na przykład ignoruje wszystkie kwoty, które przekraczają 1 mln USD. Wykorzystuje też wyrażenia regularne do przekształcania &"LASTNAME, FIRSTNAME"FIRSTNAME LASTNAME" Jeśli masz ochotę na przygodę, spróbuj napisać UDF, aby zrobić jeszcze więcej, i popraw wielkość liter (np. „"Firstname Lastname"”).

Na koniec spróbuj uruchomić kilka zapytań w odniesieniu do tabeli campaign_funding.summary, aby sprawdzić, czy są one szybsze. Pamiętaj o usunięciu opcji tabeli docelowej tabeli docelowej – w przeciwnym razie może ona zastąpić tabelę podsumowania.

Udało Ci się wyczyścić i zaimportować dane z witryny FEC do BigQuery.

Omawiane zagadnienia

  • Używasz tabel opartych na GCS w BigQuery.
  • za pomocą funkcji zdefiniowanych przez użytkownika w BigQuery,

Następne kroki

  • Wypróbuj kilka interesujących zapytań, aby dowiedzieć się, kto płaci pieniądze w tym cyklu wyborczym.

Więcej informacji

Prześlij nam swoją opinię

  • Możesz kliknąć link w lewym dolnym rogu tej strony, aby zgłosić problem lub przesłać opinię.