使用 Python 加载表时,BigQuery 不会跳过 CSV 的标题行
Posted
技术标签:
【中文标题】使用 Python 加载表时,BigQuery 不会跳过 CSV 的标题行【英文标题】:BigQuery won't skip header row of CSV when loading a table with Python 【发布时间】:2021-05-14 00:56:19 【问题描述】:我正在使用 Python 3.8 将 csv 文件作为新表加载到 Big Query 中,我定义了架构,自动检测关闭,并且 skip_leading_rows =1。当我运行该文件时,我收到以下错误:
BadRequest:读取数据时出现 400 错误,错误消息:无法将字段 Dollar_Sales(位置 13)的“Dollar Sales”解析为 DOUBLE,从位置 3913004 开始,消息“无法解析”
我的代码如下所示:
dataset_ref = client.dataset(dataset_id)
table_ref = dataset_ref.table(table_id)
job_config = bigquery.LoadJobConfig()
job_config.source_format = bigquery.SourceFormat.CSV
job_config.skip_leading_rows = 1
job_config.autodetect = True
job_config.schema = [
bigquery.SchemaField("Time", "STRING"),
bigquery.SchemaField("product", "STRING"),
bigquery.SchemaField("UPC_13_digit", "STRING"),
bigquery.SchemaField("Brand_Name", "STRING"),
bigquery.SchemaField("TGT_Private_Label_National_Brand_Value", "STRING"),
bigquery.SchemaField("Product_Type_Group", "STRING"),
bigquery.SchemaField("Primary_Package_Group", "STRING"),
bigquery.SchemaField("Aisle_Name", "STRING"),
bigquery.SchemaField("TGT_DPCI_Value", "STRING"),
bigquery.SchemaField("TGT_Class_Value", "STRING"),
bigquery.SchemaField("TGT_Subclass_Value", "STRING"),
bigquery.SchemaField("TGT_Major_Brand_Value", "STRING"),
bigquery.SchemaField("TGT_All_Brands_Value", "STRING"),
bigquery.SchemaField("Dollar_Sales", "FLOAT")
]
with open(localfilename, "rb") as source_file:
job = client.load_table_from_file(source_file, table_ref, job_config=job_config)
job.result()
print("Loaded rows into :.".format(job.output_rows, dataset_id, table_id))
它在“Dollar_Sales”列出现错误,所以我认为它实际上并没有跳过标题行,这就是为什么它不能解析标题“Dollar Sales”,因为它是一个字符串?当我测试打开自动检测而不定义架构时,它仍然包含标题行,我的整个表都是字符串。关于为什么不跳过第一行的任何想法?此外,我对错误消息中的“位置 3913004”感到困惑,因为我的 csv 只有大约 39k 行。谢谢
编辑: 我应该提到,我正在加载的 CSV 的“美元销售额”列中的值是数字,我需要保留它。
【问题讨论】:
【参考方案1】:你说:“它无法解析标题“美元销售额”,因为它是一个字符串”
但是,程序说:“无法将 'Dollar Sales' 解析为 DOUBLE”
这意味着它是一个数据类型问题,DOUBLE 是一个数字类型,你甚至告诉它它是一个 FLOAT 类型。如果需要将其设置为 STRING,也许?我假设它应该是一个数值,因为它的“美元销售额”但请记住,如果您在期望另一种数据类型时尝试使用一种数据类型,程序会发疯,例如,不能添加字符串加数字。因此,如果它抛出这样的错误,那么某个变量的类型是错误的,或者它的去向不接受该类型。
编辑 - 我刚刚注意到你离开了一个 ] 右括号,我对 Python 的了解还不够,不知道这是否有必要,或者你是否故意或意外将其删减或其他代码,但也许如果它不是数据类型问题是终止问题吗?
更新- 很遗憾,似乎我猜到了答案,仍然得到负面评价,它仍然没有被标记为答案,但我想欢迎体验。
【讨论】:
感谢@easleyfixed!事实证明,我在 csv 的“美元销售额”列中有一个不应该存在的随机字符串(新手错误),但我摆脱了它,它现在可以工作了。此外,我最初省略了右括号,因为我只粘贴了一段代码,因为原件很长,但我现在编辑了它,所以它更完整 太棒了,很高兴你明白了。数据类型是一件很烦人的事情,但有时开始添加验证代码的原因之一是,因为在编码中你知道你期望什么,但有时你没有得到你期望的东西,所以你需要进行检查以验证并验证数据类型有时只是为了确保,或者编写代码来显示当你有错误时它们实际上是什么类型。另外,认为括号是故意的,否则会出现另一个错误,但会进一步下降。如果其他人觉得这很有用,也许我的答案是“那个”? 看来你想通了,但我的回答也许是这个问题的解决方案?把它标记为这个问题的答案是不是太麻烦了,很喜欢你。 @爱德华斯托克斯以上是关于使用 Python 加载表时,BigQuery 不会跳过 CSV 的标题行的主要内容,如果未能解决你的问题,请参考以下文章
加载作业尝试使用 java 将 json 插入 BigQuery 表时解析错误
从 DataFlow 加载到现有 BigQuery 表时是不是可以更新架构?