如何在 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 的所有列作为字符串导入 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用python修复在bigquery中上传csv文件

如何使用谷歌应用脚​​本在 BigQuery 中导入 csv 日期格式

如何在 BigQuery 中将多行聚合为一行?

如何在 BigQuery SQL 中将字符串列拆分为多行单个单词和单词对?

在 Bigquery 中为多个 CSV 文件自动创建表

如何在 Android Studio 中将 CSV 文件解析为数组