【问题标题】:Azure Synapse Pipeline copy data from the BigQuery, where the source schema is hierarchical with nested columnsAzure Synapse Pipeline 从 BigQuery 复制数据,其中源架构是带有嵌套列的分层结构
【发布时间】:2023-01-30 09:25:04
【问题描述】:

请帮助我使用无服务器 SQL 池将数据从 Google BigQuery 复制到 Azure Data Lake Storage Gen2。

我正在使用 Azure Synapse 的复制数据管道。问题是我无法弄清楚如何使用分层架构处理来自 BigQuery 的源表。这会导致接收器中缺少列和不准确的日期时间值。

源是一个Google BigQuery 表,它是由Google Cloud Billing 导出的一个项目的标准使用成本。源表的模式是分层的,具有嵌套列,例如 service.id;服务说明; sku.id; sku.描述;项目.labels.key; Project.labels.value 等

当我从复制数据管道的源选项卡中单击预览数据时,它只会给我列层次结构的顶部,例如:它只会显示 [service] 的列名称和 {\v" 的值: {"f":[{"v":"[service.id]"},{"v":[service.descrpition]"}]}} image description: Source with nested columns result in issues with Synapse Copy Data Pipline

我尝试使用以下内容配置复制管道:
来源标签: 使用查询 - 我认为解决方案就在这里,但我无法弄清楚选择正确列的语法。我观看了 TechBrothersIT How to Pass Parameters to SQL query in Azure Data Factory - ADF Tutorial 2021 的 Youtube 视频,但仍然无法执行。

水槽标签:

1.以 csv、json 和 parquet 的各种格式接收数据集 - csv 和 parquet 得到相似的结果,而 json 格式失败

2.将数据集汇入 Azure SQL 数据库 - 失败,因为无服务器 SQL 池不支持它

3.映射选项卡: 注意:在 1 月 22 日用屏幕截图显示问题进行了编辑。

  1. 尝试使用导入模式,使用 None, Flatten Hierarchy and Preserve Hierarchy 的 Sink Tab 复制行为,但仍然无法将源列识别为 Hierarchical。无法获取集合参考或高级编辑器配置以显示。参考:Screenshot of Source columns not detected as HierarchicalMS Doc on Schema and data type mapping in copy activity

    我也尝试过数据流管道,但它不支持 Google BigQueryData Flow Pipe Source do not support BigQuery yet

    以下是重现/了解我的情况的步骤:

    1. 注册谷歌云,设置账单导出(标准使用成本)到 BigQuery。
    2. 在 Azure Synapse Analytics 中,创建具有用户身份验证的链接服务。请关注 Data Tech 的 Youtube 视频 "Google BigQuery connection (or linked service) in Azure Synapse analytics"
    3. 在 Azure Synapse Analytics 中,Integrate,单击“+”号 -> Copy Data Tool

      我相信答案在带有查询和函数的源选项卡中,请帮助我解决这个问题,或者为我指明正确的方向。

      期待您的意见。提前致谢!

【问题讨论】:

  • 这会导致接收器中缺少列和不准确的日期时间值。--- 1.你在excel中显示。显示如果您更改列的日期格式,它将为您提供与源相同的结果。 2. 缺少哪些栏目?从您的屏幕截图中,我无法找出缺失的列。
  • @阿斯温。谢谢你的意见。我已将目标列中管道的映射选项卡更改为日期时间,格式为"YYYY-MM-DD"YYYY-MM-DD hh:mm:ss[.nnnnnnn]""YYYY-MM-DD HH:MI:SS",它们都给出了不同的结果:2022-00-15YYYY-12-DD 01:00:00[.nnnnnnn]YYYY-12-DD 06:12I:SS。我试过调试,但输出没有详细说明它是如何处理格式的。至于缺失的列,后面的部分(右侧的列)如果为空,则整个列都将丢失。我将不得不尝试使用 Sink Tab 的复制行为来了解更多信息。
  • @Aswin,关于缺少的列,它发生在label.keylabel.value 列都为空的情况下,然后结果将合并为一列而不是两列。这导致结果列移位,例如,上面一行有两列{"v":[{"v":{"f":[{"v":"goog-resource-type"}{"v":"bigquery_dataset"}]}}]},下面一行只有一列{"v":[]},然后其余数据向左移动一列.
  • 请参考此 MS doc 将分层列转换为表格列。
  • 在复制活动映射设置中,1) 导入模式 2) 切换高级编辑器 3) 在集合引用中提供数组,以便在该值处迭代和提取数据。 4) 将列从源映射到汇

标签: tsql google-bigquery azure-data-factory azure-synapse


【解决方案1】:

ADF 允许您在google bigquery source dataset 中编写查询。因此,使用 unnest operator 编写查询以解除嵌套列的嵌套,然后将其映射到接收器。

我试图用示例嵌套表来重现它。 img:1 嵌套表格

img:2 嵌套表的样本数据

压平嵌套表的脚本:

select
user_id,
a.post_id,
a.creation_date
from  `ds1.stackoverflow_nested`  
cross  join unnest(comments) a

img:3 展平表。

  • 在复制活动源数据集中使用此查询。 img:4 复制活动的源设置。
  • 然后获取接收器数据集,进行映射并执行 ADF 管道。

参考:

  1. MS 文档google bigquery as a source - ADF
  2. unnest operator上的GC文档

【讨论】:

  • 谢谢,我试过了,得到错误语句“ERROR [42000] [Microsoft] [BigQuery] (70) Invalid query: Values referenced in UNNEST must be arrays. UNNEST contains expression of type STRUCT<id STRING, description STRING> at [5:20] 活动 ID:8547d1bf-5d76-45f9-ade9-598c035f8f77”。我尝试使用 SELECT svc.id from `std_usage_cost.gcp_billing_export_v1_01AB70_A377D7_444D9B` cross join unnest (service) svc; 当我选择整个 [service] 列时,它会给我 {"v":{"f":[{"v":"24E6-581D-38E5"},{"v":"BigQuery"}]}}
  • 错误语句表明它看到了 service.id 和 service.description,但是说“UNNEST 包含 STRUCT&lt;id STRING, description STRING&gt; 类型的表达式”是什么意思
  • 对于结构数据,没有必要取消嵌套。如果你的数据是数组类型的结构,检查这个SO thread
  • 非常感谢@Aswin,我已经坚持这个(从 BigQuery 到 Azure 的数据)一个多星期了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-30
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
相关资源
最近更新 更多