如何设置表到期时间大查询

时间:2016-06-02 10:39:31

标签: python-2.7 api google-bigquery

需要帮助设置GBQ中新表的到期时间。

我使用以下代码

在gbq中创建/上传新文件作为表格
 def uploadCsvToGbq(self, table_name, jsonSchema, csvFile, delim):
    job_data = {
        'jobReference': {
            'projectId': self.project_id,
            'job_id': str(uuid.uuid4())
        },
        #"expires":str(datetime.now()+timedelta(seconds=60)),
        #"expirationTime": 20000,
        #"defaultTableExpirationMs":20000,
        'configuration': {
            'load': {'writeDisposition': 'WRITE_TRUNCATE',
                     'fieldDelimiter': delim,
                     'skipLeadingRows': 1,
                     'sourceFormat': 'CSV',
                     'schema': {
                         'fields': jsonSchema
                     },
                     'destinationTable': {
                         'projectId': self.project_id,
                         'datasetId': self.dataset_id,
                         'tableId': table_name
                     }
                     }
        }
    }

    upload = MediaFileUpload(csvFile,
                             mimetype='application/octet-stream', chunksize=1048576,
                             # This enables resumable uploads.
                             resumable=True)
    start = time.time()
    job_id = 'job_%d' % start
    # Create the job.
    return self.bigquery.jobs().insert(projectId=self.project_id,
                                       body=job_data,
                                       media_body=upload).execute()

这是一个完美的代码,将该文件作为新表上传到GBQ,现在我需要设置表的到期时间,我已经尝试设置(已注释)expires,expirationTime和defaultTableExpirationMs,但没有任何作用。

有人有任何想法吗?

4 个答案:

答案 0 :(得分:3)

您应该使用Tables: patch API并设置expirationTime属性

答案 1 :(得分:1)

下面的函数创建一个带有expirationTime的表,因此作为替代解决方案,您可以先创建表并稍后插入数据。

def createTableWithExpire(bigquery, dataset_id, table_id, expiration_time):
    """
        Creates a BQ table that will be expired in specified time.

        Expiration time can be in Unix timestamp format e.g. 1452627594
    """    
        table_data = {
            "expirationTime": expiration_time,
            "tableReference":
                {
                    "tableId": table_id
                }
        }
        return bigquery.tables().insert(
            projectId=_PROJECT_ID,
            datasetId=dataset_id,
            body=table_data).execute()

米哈伊尔在this问题中回答。

答案 2 :(得分:0)

谢谢你们两个,我结合了两个解决方案,但为我的工作做了一些修改。 当我通过上传csv创建表时,我通过调用patch方法并将tableid传递给它来设置expirationTime,

def createTableWithExpire(bigquery, dataset_id, table_id, expiration_time):
"""
    Creates a BQ table that will be expired in specified time.

    Expiration time can be in Unix timestamp format e.g. 1452627594
"""    
    table_data = {
        "expirationTime": expiration_time,
    }
    return bigquery.tables().patch(
        projectId=_PROJECT_ID,
        datasetId=dataset_id,
        tableId=table_id,
        body=table_data).execute()

答案 3 :(得分:0)

另一种替代方法是在创建表后设置到期时间:

from google.cloud import bigquery
import datetime 
client    = bigquery.Client()
table_ref = client.dataset('my-dataset').table('my-table') # get table ref
table     = client.get_table(table_ref) # get Table object

# set datetime of expiration, must be a datetime type
table.expires = datetime.datetime.combine(datetime.date.today() +  
                                          datetime.timedelta(days=2),
                                          datetime.time() )
table = client.update_table(table, ['expires']) # update table