多态数据转换技术/数据湖/大数据



背景:我们正在开发一种解决方案,从各种客户端接收大量遥测数据。数据采用xml格式,包含多个独立的信息组,这些信息组具有许多嵌套元素。客户端具有不同的版本,因此数据在数据湖中以不同但相似的模式获取。例如,startDate字段可以是字符串或包含日期的对象。)我们的目标是在BI工具中可视化积累的信息。

问题:处理多态数据的最佳实践是什么?

  • 使用编程语言处理所需的数据(精简版)并将其转换为统一模式文件,然后在spark和databricks中处理,并在BI工具中使用
  • 将数据分解为有意义的组,并用spark和databricks处理和连接(使用数据关系)它们

我感谢您对本主题的评论以及分享意见和经验,特别是来自主题专家和数据工程师的意见和经验。如果你也能分享一些关于这个特定主题的有用资源,那就太好了。

干杯!

您为此线程选择的一个标记指出,您希望使用Databricks进行此转换。Databricks是我正在使用的工具之一,我认为它足够强大和有效,可以进行这种数据处理。由于我使用最多的数据处理平台是Azure和Cloudera,我的答案将依赖于Azure堆栈,因为它与Databricks集成在一起。根据我的经验,以下是我的建议。

你首先要做的是定义数据层并为它们创建一个平台。特别是,对于您的案例,它应该具有着陆区、暂存、ODS和数据仓库层。

着陆区

将用于从您的客户端接收多态数据。这只能通过在客户端和Azure Blob存储之间连接的Azure数据工厂(ADF)来完成。我建议,在这一层中,我们不要在ADF管道中进行任何转换,这样我们就可以创建一个用于接收原始文件的通用管道。如果你有很多客户端可以将数据发送到Azure存储,这很好。您也可以为它们创建一些专用文件夹。

通常,我会创建与客户端类型一致的文件夹。例如,如果我有三种类型的客户端,Oracle、SQL Server和SAP,那么我的Azure存储上的根文件夹将是Oracle、SQL_Server和SAP,后面是服务器/数据库/客户端名称。

此外,如果你要从物联网设备中获取数据,你似乎必须建立Azure物联网中心。如果是这样的话,这个页面会很有帮助。

暂存区

将是架构清理的区域。我将有多个ADF管道,它们将多态数据从着陆区转换并摄入到暂存区。您必须为每个分解的数据集和数据源创建模式(delta表)。我建议使用德尔塔湖,因为它将易于管理和检索数据。

您将拥有的转换选项有:

  • 仅使用ADF转换。它将允许您取消测试一些嵌套的XML列,并从Landing Zone中进行一些数据清理和争论,以便将相同的数据集插入到相同的表中。

    对于您的情况,您可能需要为每个数据集乘以客户端版本创建特定的ADF管道。

  • 使用额外的通用ADF管道,该管道基于数据集和客户端版本运行Databricks转换。这将允许ADF转换无法进行的更复杂的转换。

    对于您的案例,对于每个数据集乘以客户端版本,还会有一个特定的Databricks笔记本。

因此,将从原始文件中提取一个特定数据集的不同版本,根据模式进行清理,并将其纳入每个数据源的一个表中。不同数据源的主数据集将存在一些重复数据。

ODS区域

这将是一个所谓的数据真实性单一来源的领域。多个数据源将合并为一个。因此,所有重复的数据都会被消除,数据集之间的关系也会得到澄清,从而得到每个问题的第二个项目。如果您只有一个数据源,那么这也是应用更多数据清理的领域,例如验证和一致性。因此,一个数据集将存储在一个表中。

我建议使用运行Databricks的ADF,但这次,我们可以使用SQL笔记本而不是Python,因为数据已经很好地插入到暂存区域的表中。

此阶段的数据可由Power BI消耗。阅读有关Power BI与Databricks集成的更多信息。

此外,如果您仍然想要数据仓库或星型架构用于高级分析,您可以进行进一步的转换(再次通过ADF和Databricks)并利用Azure Synapse。

源代码管理

幸运的是,由于微软收购了Github,我上面提到的工具已经与源代码版本控制集成在一起。Databricks笔记本和ADF管道源代码可以进行版本控制。检查Azure DevOps。

非常感谢您的全面回答PhuriChal!事实上,数据源总是相同的软件,但有各种不同的版本,不幸的是,这些版本之间的数据属性并不总是保持稳定。是否可以选择在摄入后处理原始数据,以便在数据块中进一步处理之前使用高级编程语言统一和解决不匹配的属性?(我们可能有很多这样的处理代码来完善特定提议的原始数据)我在原来的帖子中添加了一个例子。

Version1:{
'theProperty': 8
}
Version2:{
'data':{
'myProperty': 10
}
}

Processing =>
Refined version: [{
'property: 8
},
{
'property: 10
}]

以便在数据到达数据块进行进一步处理之前解决不一致性。这也是一种选择吗?

最新更新