如何在 Bigquery 中将 csv 的所有列作为字符串导入 [关闭]
Posted
技术标签:
【中文标题】如何在 Bigquery 中将 csv 的所有列作为字符串导入 [关闭]【英文标题】:How to import all columns of a csv as Strings in Bigquery [closed] 【发布时间】:2022-01-14 03:35:41 【问题描述】:我正在使用气流将 CSV
文件(例如 FILE__YYYYMMDD.csv)从 GCS 存储桶解压缩到 BigQuery。由于文件经过几个月的演变,其架构发生了变化(添加了更多列)。所以我使用选项autodetect
来设置BQ 中的表模式。不幸的是,一些关键列被自动检测错误(由于某种原因将六进制哈希检测为浮点数),所以我想将每一列作为字符串导入,然后将其转换为应该分析表的查询......
-
您推荐这种方法吗?
如何告诉 Bigquery“自动检测列(名称),但将其类型设置为字符串”
【问题讨论】:
你是导入新表还是现有表? @guillaumeblaquiere 我在分片表上使用 WRITE_TRUNCATE(每天一个)...为什么这相关? 如果表已经存在,请先创建架构,然后导入文件。 @guillaumeblaquiere 正如我所说,架构发生了变化。例如。在 2020/12/01 它有 7 列,在 2021/03/01 它有 8 列,......现在它有更多。为了使这些文件的导入通用且可自动化,此处使用自动检测很重要。 无论如何,这些表都不存在。工作是从 GCS 导入到 BQ 【参考方案1】:如果架构可以随时更改,最安全的方法是创建工作流:
在临时表中导入新文件 创建一个合并查询,将临时表中的数据合并到最后一个。在该合并查询中,您可以将字段转换为要合并最终表格中的数据的格式。(临时表会被自动删除)
编辑 1
在评论讨论之后,您的用例无法在 BigQuery 上开箱即用地实现。在集成之前你必须做更多的事情。
我的想法如下:
当有文件进来时,获取标题行 获取目标表的架构 如果标头的字段多于目标表,请使用 STRING 类型的新列更新架构。 在 BigQuery 中加载文件,其中包含您从标题读取中推断出的架构和allow_jagged_rows
参数,以允许与最终架构更少的列进行集成。从 Cloud Storage 加载文件,而不是从您的代码中加载。
【讨论】:
使用什么模式导入临时表中的新文件? + 自动检测分配错误的类型 是的,但是您在最终表中执行合并请求以将错误的类型转换为正确的类型。 那行不通。让我说明一下:哈希列(应该作为字符串导入)以某种方式被检测为整数,因此它的值更改而不是“0x ...”我得到“1982 ...”,我无法尝试将其重新转换为字符串,因为我丢失了信息“0x....” 但是您关于创建工作流程的意见给了我一个想法。我想我将手动创建“最新”和最全面文件的模式(包含所有列、它们的名称、模式和类型),并将其放入字典中,然后动态重新创建所需的 json 作为 BQ 的输入导入,在我解析 csv 文件的标题并将其与适当的字典进行比较之后。 您是否一直需要所有列?还是只做核心栏目,不在意时间能加新的?以上是关于如何在 Bigquery 中将 csv 的所有列作为字符串导入 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用谷歌应用脚本在 BigQuery 中导入 csv 日期格式