2016-08-02 3 views
2

동일한 프로젝트 내에서 한 데이터 세트의 테이블 세트를 다른 데이터 세트로 복사하려고합니다. Ipython 노트북에서 코드를 실행합니다.하나의 데이터 세트에서 다른 데이터 세트로 google big 쿼리로 복사

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 

그럼 내가 다른 하나 개의 데이터 집합에서 테이블을 복사하려면 "BQ은 cp"명령을 사용하여 시도 :

나는 테이블 이름의 목록이 아래의 코드를 사용하여 변수 "값"에 복사 할 수 . 하지만 노트북에서 bq 명령을 실행할 수는 없습니다.

!bq cp $value proj1:test1.table1_20162020 

참고 :

나는 거기에 관련된 복사 명령은 그러나 어떤을 찾을 수 있는지 확인하기 위해 BigQuery를 명령했습니다.

도움이 될 것입니다!

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) 

bq cp 명령은 기본적으로 수행합니다 워드 프로세서에서 파이썬 예를 복사

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

: 파이썬과의 BigQuery API를 사용하는 경우

답변

2

, 당신은 복사 작업을 실행할 수 있습니다 같은, 내부적으로 (당신도 당신이 가져 오는 무엇 bq에 따라 해당 기능을 호출 할 수 있습니다).

+0

감사합니다. Felipe. 하지만 제 시나리오에서는 동일한 이름으로 시작하지만 끝에 다른 타임 스탬프가있는 여러 테이블을 복사해야합니다. 그 이유는 내가 테이블 목록을 통해 루프와 'table1'로 시작하는 테이블의 목록을 얻을 – user3447653

+0

뭔가 파이썬과 제공된 코드로 자동화하기 쉬운 것 같아? –

0

나를 위해 완벽하게 작동하기 때문에 나는 당신을 위해 작동하지 않는 이유가 아닙니다.

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 

나에게 적합하기 때문에 노트북에서 사용해보십시오.
스크립트에서 반환하는 오류 코드는 무엇입니까?

관련 문제