2016-08-02 34 views
2

Ich beabsichtige, eine Reihe von Tabellen aus einem Datensatz in ein anderes innerhalb des gleichen Projekts zu kopieren. Ich führe den Code in Ipython Notizbuch aus.Kopieren Sie die Tabelle von einem Datensatz zu einem anderen in Google große Abfrage

ich die Liste der Tabellennamen in den Variablen „Wert“ kopiert werden, um den folgenden Code verwendet:

list = bq.DataSet('test:TestDataset') 

for x in list.tables(): 
    if(re.match('table1(.*)',x.name.table_id)): 
    value = 'test:TestDataset.'+ x.name.table_id 

Dann habe ich versucht, die „bq cp“ Befehl Tabelle von einem zum anderen Datensatz kopieren . Aber ich kann den Befehl bq im Notebook nicht ausführen.

!bq cp $value proj1:test1.table1_20162020 

Hinweis:

Ich habe versucht, mit BigQuery Befehl zu überprüfen, ob ein Kopierbefehl mit ihm verbunden ist, aber keine finden konnte.

Jede Hilfe würde geschätzt werden !!

Antwort

2

Wenn Sie die BigQuery API mit Python verwenden, können Sie einen Kopierauftrag auszuführen:

https://cloud.google.com/bigquery/docs/tables#copyingtable

Kopieren des Python-Beispiel aus der Dokumentation:

def copyTable(service): 
    try: 
    sourceProjectId = raw_input("What is your source project? ") 
    sourceDatasetId = raw_input("What is your source dataset? ") 
    sourceTableId = raw_input("What is your source table? ") 

    targetProjectId = raw_input("What is your target project? ") 
    targetDatasetId = raw_input("What is your target dataset? ") 
    targetTableId = raw_input("What is your target table? ") 

    jobCollection = service.jobs() 
    jobData = { 
     "projectId": sourceProjectId, 
     "configuration": { 
      "copy": { 
       "sourceTable": { 
        "projectId": sourceProjectId, 
        "datasetId": sourceDatasetId, 
        "tableId": sourceTableId, 
       }, 
       "destinationTable": { 
        "projectId": targetProjectId, 
        "datasetId": targetDatasetId, 
        "tableId": targetTableId, 
       }, 
      "createDisposition": "CREATE_IF_NEEDED", 
      "writeDisposition": "WRITE_TRUNCATE" 
      } 
     } 
     } 

    insertResponse = jobCollection.insert(projectId=targetProjectId, body=jobData).execute() 

    # Ping for status until it is done, with a short pause between calls. 
    import time 
    while True: 
     status = jobCollection.get(projectId=targetProjectId, 
           jobId=insertResponse['jobReference']['jobId']).execute() 
     if 'DONE' == status['status']['state']: 
      break 
     print 'Waiting for the import to complete...' 
     time.sleep(10) 

    if 'errors' in status['status']: 
     print 'Error loading table: ', pprint.pprint(status) 
     return 

    print 'Loaded the table:' , pprint.pprint(status)#!!!!!!!!!! 

    # Now query and print out the generated results table. 
    queryTableData(service, targetProjectId, targetDatasetId, targetTableId) 

    except HttpError as err: 
    print 'Error in loadTable: ', pprint.pprint(err.resp) 

Der bq cp Befehl funktioniert im Grunde das gleiche, intern (Sie könnten diese Funktion auch aufrufen, je nachdem, was bq Sie importieren).

+0

Danke Felipe. Aber in meinem Szenario muss ich mehrere Tabellen kopieren, die mit dem gleichen Namen beginnen, aber am Ende unterschiedliche Zeitstempel haben. Das war der Grund, warum ich die Tabellenliste durchlaufe und die Liste der Tabellen, die mit 'table1' beginnen, erhält. – user3447653

+0

scheint etwas zu sein, das mit Python und dem bereitgestellten Code einfach zu automatisieren ist? –

0

Ich bin nicht warum es nicht für Sie arbeitet, da es perfekt für mich funktioniert.

projectFrom = 'project1' 
datasetFrom = 'dataset1' 
tableSearchString = 'test1' 

projectTo = 'project2' 
datasetTo = 'dataset2' 

tables = bq.DataSet(projectFrom + ':' + datasetFrom).tables() 

for table in tables: 
    if tableSearchString in table.name.table_id: 

    tableFrom = projectFrom + ':' + datasetFrom + '.' + table.name.table_id 
    tableTo = projectTo + ':' + datasetTo + '.' + table.name.table_id 

    !bq cp $tableFrom $tableTo 

Versuchen Sie dies in Ihrem Notebook, da es gut für mich funktioniert.
Ich frage mich nur, was ist der Fehlercode, der von Ihrem Skript zurückkommt?