首页 > 解决方案 > Azure:从 BigQuery 提取点击流数据

问题描述

我需要将 BigQuery 中的事件数据提取到 Azure 中,目的是能够对其应用一些分析。

到目前为止,我一直在使用数据工厂。现在,问题是,我不确定如何转换和存储数据。BigQuery 中的数据是高度嵌套的,结构示例:

   [
    {"event_date": "<int>",
     "event_timestamp": "<int>",
     "event_name": "<string>",
     "event_params": [
                 {"key": "<string>",
                     "value": {"string_value": "<string>",
                              "int_value": <int>,
                              "float_value": <float>,
                              "double_value": <double>}},
                 {"key": "<string>",
                     "value": {"string_value": "<string>",
                               "int_value": <int>,
                               "float_value": <float>,
                               "double_value": <double>}},
                {"key": "<string>",
                     "value": {"string_value": "<string>",
                               "int_value": <int>,
                               "float_value": <float>,
                               "double_value": <double>}},
                {"key": "<string>",
                     "value": {"string_value": "<string>",
                               "int_value": <int>,
                               "float_value": <float>,
                               "double_value": <double>}},
                {"key": "<string>",
                     "value": {"string_value": "<string>",
                               "int_value": <int>,
                               "float_value": <float>,
                               "double_value": <double>}},
                {"key": "<string>",
                     "value": {"string_value": "<string>",
                              "int_value": <int>,
                              "float_value": <float>,
                              "double_value": <double>}}
                    ],
     "event_previous_timestamp": <int>,
     + (more key-value pairs of user information etc)
     },
   { event2 },
   { event3 }, 
  ]

event2 和 event3 表示有一个事件列表,每个事件都包含代码片段第一部分中描述的嵌套数组。我想创建一个数据湖类型的解决方案,其中包含平面 CSV 文件和 Power BI 从那里读取数据。我开始尝试将数据展平为 CSV,以便 Power BI 可以轻松解析它,但这会导致数据文件的大小成倍增加。Power BI 可以接收 JSON,但嵌套 JSON 存在问题,因为每个嵌套数组都需要打开。

您认为这里应该采用什么方法?我可以使用所有 Microsoft/Azure 生态系统工具。

我可以想到这些选项:

  1. 坚持使用巨大的平面 CSV 文件,Power BI 非常慢并且文件占用大量空间
  2. 在 Power BI 中嵌套 JSON,使用一些电源查询代码自动取消嵌套数据
  3. 将数据写入 SQL 数据库,我可以在其中根据事件 ID 在表之间创建连接

你们有任何想法如何进行吗?如果我的描述没有涵盖任何内容,请告诉我,我会尝试添加。谢谢!

标签: azuregoogle-bigquerypowerbi

解决方案


有趣的是,BigQuery 是一种数据仓库类型的解决方案,您将其用作数据湖的馈送。通常情况会反过来,比如 Big Query。PowerBI支持 BigQuery和一个非常强大的直接/实时查询引擎。

也就是说,我明白你想要做什么。我们遇到过各种各样的 JSON 噩梦,并且像您一样发现尝试在 PowerQuery 中对 JSON 进行解透视和解绑既乏味又缓慢。

但是,您的 JSON 看起来并没有那么糟糕,如果我正确阅读它,我会看到它很好地转换为 CSV / TSV:

"event_date", "event_timestamp", "event_name", "key 1", "key 2", "key 3", "event_previous_timestamp", ...

从流水线的角度来看,我会将 BigQuery 中的所有 JSON 以 RAW 格式放入湖中,如果您关心体积,可以使用Parquet 。然后让第二个活动将事件 JSON 数据转换为更简单(更扁平)的 JSON(可能一种结构用于核心事件数据,另一种用于用户数据等,由 EventId 链接所有)并将其存储在湖的 STAGED 区域以便于使用在 PowerBI 中。

更进一步,如果您希望 PowerBI 具有更高的性能并可以选择在 DirectQuery 模式下工作,您可以将 SQL DB 或 Synapse 添加为 DataMart 以生成事实和维度。

我们的团队中有强大的开发人员,并使用 Azure 函数将疯狂的 JSON 文件分解为更合理的结构。

不是最好的答案,但我希望它有所帮助。


推荐阅读