如何使用 Python gcloud.bigquery 客户端跳过标题行?

Posted

技术标签:

【中文标题】如何使用 Python gcloud.bigquery 客户端跳过标题行?【英文标题】:How do I skip header row using Python glcoud.bigquery client? 【发布时间】:2017-02-08 08:16:12 【问题描述】:

我有一个 csv 格式的每日 GCP 结算导出文件,其中包含 GCP 结算详细信息。此导出包含标题行。我已经按如下方式设置了加载作业(总结):

from google.cloud import bigquery
job = client.load_table_from_storage(job_name, dest_table, source_gs_file)
job.source_format = 'CSV'
job.skipLeadingRows=1
job.begin()

此作业产生错误:

无法将“开始时间”解析为时间戳。所需格式为 YYYY-MM-DD HH:MM[:SS[.SSSSSS]]

此错误表示即使我指定了 skipLeadingRows=1,它仍在尝试解析标题行。我在这里做错了什么?

【问题讨论】:

【参考方案1】:

在使用 Python SDK 时,您应该使用 skip_leading_rows 而不是 skipLeadingRows

skip_leading_rows:读取数据时要跳过的行数(仅限 CSV)。

参考:https://googleapis.dev/python/bigquery/latest/generated/google.cloud.bigquery.job.LoadJobConfig.html

【讨论】:

【参考方案2】:

我无法重现此内容。我以您提供的示例(“2017-02-04T00:00:00-08:00”)为例,在 csv 文件中添加了 3 行/时间戳,将其上传到 GCS,最后在 BigQuery 中创建了一个包含一列的空表类型为TIMESTAMP

文件内容:

2017-02-04T00:00:00-08:00
2017-02-03T00:00:00-08:00 
2017-02-02T00:00:00-08:00

然后我运行找到here 的示例Python 脚本,它成功地将文件加载到表中:

将 3 行加载到 timestamp_test:gcs_load_test 中。

def load_data_from_gcs(dataset_name, table_name, source):
    bigquery_client = bigquery.Client()
    dataset = bigquery_client.dataset(dataset_name)
    table = dataset.table(table_name)
    job_name = str(uuid.uuid4())

    job = bigquery_client.load_table_from_storage(job_name, table, source)

    job.begin()

    wait_for_job(job)

    print('Loaded  rows into :.'.format(job.output_rows, dataset_name, table_name))

【讨论】:

啊哈......所以它不是 T 分隔符。我的错!谢谢你把这个放在格雷厄姆身上并证明我错了。我错过了错误消息第一部分中指出的真正问题,该部分指出:“无法将'开始时间'解析为时间戳”。 “开始时间”来自 CSV 标题行。我在脚本中包含了“job.skipLeadingRows = 1”,但这似乎不起作用。为什么作业没有跳过该标题行? 请注意,我已根据 Graham 的有用反馈修改了我原来的问题。 太棒了,那就是另外一回事了。凉爽的。但是,只是为了将来参考,完全编辑原始问题并将其变成一个新问题并不是一个好主意,因为我的答案现在完全无关紧要。最好从原始问题中衍生出一个新问题,并将其标记为已解决。

以上是关于如何使用 Python gcloud.bigquery 客户端跳过标题行?的主要内容,如果未能解决你的问题,请参考以下文章

FME如何使用Python?

如何使用python读写文件?

如何使用 Boost.Python 定义 Python 元类?

2.如何使用python连接hdfs

python如何输入矩阵

python2.6如何使用PIL