【问题标题】:How to import all columns of a csv as Strings in Bigquery [closed]如何在 Bigquery 中将 csv 的所有列作为字符串导入 [关闭]
【发布时间】:2022-01-14 03:35:41
【问题描述】:

我正在使用气流将 CSV 文件(例如 FILE__YYYYMMDD.csv)从 GCS 存储桶解压缩到 BigQuery。由于文件经过几个月的演变,其架构发生了变化(添加了更多列)。所以我使用选项autodetect 来设置BQ 中的表模式。不幸的是,一些关键列被自动检测错误(由于某种原因将六进制哈希检测为浮点数),所以我想将每一列作为字符串导入,然后将其转换为应该分析表的查询......

  1. 您推荐这种方法吗?
  2. 如何告诉 Bigquery“自动检测列(名称),但将其类型设置为字符串

【问题讨论】:

  • 你是导入新表还是现有表?
  • @guillaumeblaquiere 我在分片表上使用 WRITE_TRUNCATE(每天一个)...为什么这相关?
  • 如果表已经存在,请先创建架构,然后导入文件。
  • @guillaumeblaquiere 正如我所说,架构发生了变化。例如。在 2020/12/01 它有 7 列,在 2021/03/01 它有 8 列,......现在它有更多。为了使这些文件的导入通用且可自动化,此处使用自动检测很重要。
  • 无论如何,这些表都不存在。工作是从 GCS 导入到 BQ

标签: google-cloud-platform database-design google-bigquery airflow


【解决方案1】:

如果架构可以随时更改,最安全的方法是创建工作流:

  • 在临时表中导入新文件
  • 创建一个合并查询,将临时表中的数据合并到最后一个。在该合并查询中,您可以将字段转换为要合并最终表格中的数据的格式。

(临时表会被自动删除)


编辑 1

在评论讨论之后,您的用例无法在 BigQuery 上开箱即用地实现。在集成之前你必须做更多的事情。

我的想法如下:

  • 当有文件进来时,获取标题行
  • 获取目标表的架构
    • 如果标头的字段多于目标表,请使用 STRING 类型的新列更新架构。
  • 在 BigQuery 中加载文件,其中包含您从标题读取中推断出的架构和 allow_jagged_rows 参数,以允许与最终架构更少的列进行集成。从 Cloud Storage 加载文件,而不是从您的代码中加载。

【讨论】:

  • 使用什么模式导入临时表中的新文件? + 自动检测分配错误的类型
  • 是的,但是您在最终表中执行合并请求以将错误的类型转换为正确的类型。
  • 那行不通。让我说明一下:哈希列(应该作为字符串导入)以某种方式被检测为整数,因此它的值更改而不是“0x ...”我得到“1982 ...”,我无法尝试将其重新转换为字符串,因为我丢失了信息“0x....”
  • 但是您关于创建工作流程的意见给了我一个想法。我想我将手动创建“最新”和最全面文件的模式(包含所有列、它们的名称、模式和类型),并将其放入字典中,然后动态重新创建所需的 json 作为 BQ 的输入导入,在我解析 csv 文件的标题并将其与适当的字典进行比较之后。
  • 您是否一直需要所有列?还是只做核心栏目,不在意时间能加新的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2020-03-21
  • 2020-06-14
相关资源
最近更新 更多