Chcę usunąć kolumnę z listy kolumn powróconych z dużej kwerendy.

Używam Pythona Big Query API i zwracam listę kolumn za pomocą instrukcji SQL:

SELECT column_name FROM `{project_id}.{dataset_id}`.INFORMATION_SCHEMA.COLUMNS

Następnie wykonaj listę zwrotów zwrotu:

bq_schema_target = list(query_job.result())

print(bq_schema_target)

Zwraca --- >.

[Row(('crownumber',), {'column_name': 0}), Row(('cstring1',), {'column_name': 0})]

Podejście, które próbuję, to:

Column = 'cstring1'

if Column in bq_schema_target :
    bq_schema_target.remove(Column)

To podejście nie znajduje moją kolumnę na liście

Wszelkie porady zostałyby doceniane.

0
BSpinoza 27 lipiec 2020, 05:16

1 odpowiedź

Najlepsza odpowiedź

Rozumiem, że chcesz usunąć konkretny element z listy kolumn, co jest wynikiem zapytania.

Podejście, które próbujesz, używając Usuń () Metoda, nie działa Ponieważ lista (Query_JOB.Result ()) Zwraca listę kanałów. W ten sposób, aby uzyskać dostęp do konkretnego elementu wewnątrz niego, konieczne jest: pętla przez listę, zignoruj niepożądany element, dołącz wyniki na nową listę . Stworzyłem dwa podejścia do twojej sprawy. Ponadto, z poniższymi rozwiązaniami używałem publicznego zestawu danych, CENSUS_BUREAu_USA , do testowania kodu.

Najpierw , częściowo za pomocą kodu:

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

list_of_columns=[]

query = """
    SELECT
     column_name
    FROM
     `bigquery-public-data`.census_bureau_usa.INFORMATION_SCHEMA.COLUMNS
    WHERE
     table_name="population_by_zip_2010"
"""

query_job = client.query(query)  # Make an API request
query
bq_schema_target = list(query_job.result())

for row in bq_schema_target:
    if row[0] != "geo_id":
        list_of_columns.append(row)
    
print("Initial list of columns:\n{}".format(bq_schema_target))
print("\n\n")
print("Final list of columns:\n{}".format(list_of_columns))

I wyjście,

    Initial list of columns:
    [Row(('geo_id',), {'column_name': 0}), Row(('zipcode',), {'column_name': 0}), Row(('population',), {'column_name': 0}), Row(('minimum_age',), {'column_name': 0}), Row(('maximum_age',), {'column_name': 0}), Row(('gender',), {'column_name': 0})]
    
    Final list of columns:
    [Row(('zipcode',), {'column_name': 0}), Row(('population',), {'column_name': 0}), Row(('minimum_age',), {'column_name': 0}), Row(('maximum_age',), {'column_name': 0}), Row(('gender',), {'column_name': 0})]

Zauważ, że kolumna o nazwie geo_id nie jest zawarta na końcowej liście list_of_columns.

Po drugie, w tym podejściu Metoda listy nie jest używana, zamiast tego można uzyskać bezpośrednio wyników zapytania, a tylko żądane kolumny są dołączane do ostatecznej listy kolumn. W następujący sposób,

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

list_of_columns=[]

query = """
    SELECT
     column_name
    FROM
     `bigquery-public-data`.census_bureau_usa.INFORMATION_SCHEMA.COLUMNS
    WHERE
     table_name="population_by_zip_2010"
"""

query_job = client.query(query)  # Make an API request

for row in query_job:
    if row[0] != "geo_id":
        list_of_columns.append(row[0])
        #print(row[0])
        
#print("Initial list of columns:\n{}".format(bq_schema_target))
#print("\n\n")
print("Final list of columns:\n{}".format(list_of_columns))

I wyjście,

Final list of columns:
['zipcode', 'population', 'minimum_age', 'maximum_age', 'gender']

Po raz kolejny kolumna geo_id nie jest w ostatecznym wyjściu.

1
Alexandre Moraes 27 lipiec 2020, 07:40