在我备考Salesforce数据云认证时,遇到了“零ETL”这个术语。数据云提供了直接从其他系统(如数据仓库或数据湖)访问数据的可能性,也能在不复制数据的情况下与这些系统共享数据。Salesforce也将其描述为“自带数据湖(BYOL)”,参考了“自带设备(BYOD)”这个术语。我想更好地理解零ETL的概念,并以一种易于理解的方式对其进行阐释。
在本文中,我将向你展示如何使用Python创建一个简化的ETL流程,以便更好地理解这个概念,弄清楚零ETL或零拷贝的含义,以及这种新的数据集成方法是如何在Salesforce数据云中实现的。
目录
传统ETL流程:面向初学者的Python分步指南
那么,什么是零ETL?
为何采用零ETL?其优势与劣势
在Salesforce数据云中零ETL是什么样的?
总结思考
传统ETL流程:面向初学者的Python分步指南 如果你已经熟悉ETL和ELT流程,可以跳过本部分。如果你刚接触这个主题,看看这个超级简化的示例,以便更好地理解抽取(Extract)、转换(Transform)、加载(Load)这个流程。或者更好的做法是自己动手构建一下——通过实践,你通常能更好地理解这些概念。
1 - 抽取(Extract) 在传统的ETL数据处理管道中,数据是从诸如数据库、API、JSON文件、XML文件或其他数据仓库等数据源收集而来的。
在我们的示例中,首先要创建一个包含客户数据的CSV文件。我已经整理好了一个包含示例数据的文件,其中有“名字(First Name)”“姓氏(Last Name)”“电子邮件(Email)”“已购产品(Purchased _Product)”和“支付价格(Price_Paid)”这些列。你可以在GitHub上找到CSV文件以及代码。
然后我们使用pandas
读取这个CSV文件,并显示前5行:
import pandas as pd
import sqlite3
import matplotlib.pyplot as plt
# 步骤1:抽取
# 从csv文件读取数据
file_path = 'YOURPATH' # 在Windows系统中,路径需用/分隔
data = pd.read_csv(file_path)
print("抽取的数据:")
print(data.head())
这些数据展示了从包含客户数据的CSV文件中抽取的数据。
如果你在搭建Python环境方面需要帮助,最好阅读一下《Python数据分析生态系统——初学者路线图》一文中的步骤。我在做这类项目时会使用Anaconda和Jupyter Lab。要使代码正常运行,你需要安装pandas
、sqlite3
和matplotlib
。如果你使用的是Anaconda,可以在Anaconda命令提示符终端中输入命令“conda install pandas, sqlite, matplotlib
”。
2 - 转换(Transform) 在传统ETL流程中,一旦数据被抽取出来,紧接着就是数据转换环节。这可能意味着列值要进行合并、执行计算、合并表格或者移除不必要的信息。
在我们的示例中,这一步将进行两项简单的转换。首先,我们基于名字和姓氏创建一个新列来存储全名。然后,在一个新列中,我们要区分出消费金额高的客户和消费金额低的客户。为此,我们还要创建一个新的布尔型列,对于支付金额超过20的所有行填入“是(Yes)”。
# 步骤2:转换
# 通过组合名字和姓氏创建新列“全名(Full_Name)”
data['Full Name'] = data['First Name'] + ' ' + data['Last Name']
# 如果“支付价格(Price_Paid)”大于20,则在新列“高消费(High_Payment)”中填入“是(Yes)”,否则填入“否(No)”
data['High_Payment'] = data['Price_Paid'].apply(lambda x: 'Yes' if x > 20 else 'No')
我们再次显示前5行,以检查这些转换是否成功完成(新增了“全名(Full Name)”和“高消费(High_Payment)”这两个新列):
# 显示前5行
print("转换后的数据:")
print(data.head())
3 - 加载(Load) 转换之后,传统ETL流程涉及将数据加载到一个平台上以便进行进一步分析。例如,可以对数据应用机器学习方法,或者将数据可视化用于仪表盘和报告。
在我们的示例中,这一步将把转换后的数据加载到一个SQLite数据库中。可以说,SQLite是MySQL的“妹妹”,它非常适合处理中小型数据量的简单项目。在这里,我们还会对数据进行一个小分析并将其可视化。
# 步骤3:加载
# 连接到SQLite数据库(如果不存在则创建它)
conn = sqlite3.connect('output_database.db')
# 将数据框加载到SQLite数据库中的一个新表
data.to_sql('transformed_data', conn, if_exists='replace', index=False)
# 分析:确定有多少客户进行了高额支付
high_payment_count = data[data['High_Payment'] == 'Yes'].count()
print("高额支付的数量:", high_payment_count['High_Payment'])
# 关闭数据库连接
conn.close()
print("ETL流程已完成。转换后的数据已保存到‘output_database.db’中。")
# 可视化数据
data['Price_Paid'].hist(bins=10)
plt.title('支付价格分布')
plt.xlabel('价格')
plt.ylabel('频率')
plt.show()
如你所见,这个示例非常简化。当然,在实际项目中抽取的数据量要大得多,转换操作通常也复杂得多,而且数据通常会被加载到其他数据库、数据仓库、数据湖或数据可视化工具等系统中。
那么,这种传统ETL流程存在哪些挑战呢?
通过这个流程,数据无法实时获取,通常是按批次进行处理和复制的。此外,该流程需要更多资源,因此会消耗更多成本。这就是零ETL概念产生的背景。
这正是亚马逊网络服务(Amazon Web Services)、谷歌云(Google Cloud)和微软Azure等云服务提供商所秉持的理念:数据应该能够几乎实时地进行处理和分析,且没有较大延迟。
零ETL是数据集成领域的一个概念。与传统上需要在不同步骤中明确地抽取、转换和加载数据不同,数据应该能在不同系统之间无缝流动。这个术语是亚马逊网络服务(AWS)在2022年为将亚马逊Aurora集成到亚马逊Redshift中而引入的。
这个概念的新颖之处在于,该技术使得能够以原始格式几乎实时地使用或分析数据。无需移动数据,数据延迟被最小化,数据可以在单个平台内进行转换和分析。
想象一下,传统ETL就好比在屋外用水桶收集水,然后再把水提到淋浴间。这个过程不仅耗时费力,而且在路上还可能会洒水。好吧,10年前我在坦桑尼亚待了4个月,当时我就是这么洗澡的;)但正常情况下,你大概率会更喜欢像零ETL运输水那样的淋浴方式:换个角度说,零ETL意味着你站在淋浴间,打开水龙头,干净的水就直接流出来了。水(或者说数据)无需被搬运到别的地方,即便它存储在不同位置,也能直接使用。
如果你想进一步了解使零ETL成为可能的技术,我推荐阅读DataCamp的一篇博客文章。那里对数据库复制、联邦查询、数据流以及就地数据分析等术语都有很好的解释。
零ETL并不遵循抽取 - 转换 - 加载的流程。借助零ETL,云平台能够近乎实时地访问和共享数据。
自己绘制的示意图
优势
劣势
在数据仓库中使用数据云的数据 想象一下,一家电子公司将其所有潜在客户和联系人数据都存储在Salesforce客户关系管理系统(CRM)中。这个CRM与数据云相连接,以便数据随后能在营销工具中使用。该公司将在线行为、客户服务交互以及物流方面的数据存储在数据云中。例如,它还使用“计算洞察(Calculated Insights)”来计算客户终身价值(CLV)。该公司还使用像Snowflake这样的数据仓库,在其中存储网站上所有已售产品的交易数据、所售产品的相关信息以及交付和库存水平的数据。
现在,该公司无需从数据云物理复制数据,而是可以在Snowflake中创建一个虚拟表,该虚拟表直接指向Salesforce数据云中的数据。这意味着公司可以直接在Snowflake中对这些数据进行查询,即便数据仍保留在数据云中。
在数据仓库中使用数据云的数据 自己绘制的示意图
如何做到这一点呢? 在数据云中,首先必须定义数据湖对象、数据模型对象或计算洞察。然后设置数据共享。这意味着,你必须将这些对象链接到数据共享目标——在我们的示例中就是Snowflake。在Snowflake中,你需要创建包含结构以及指向数据云中实际数据的引用的虚拟表。然后你就可以在Snowflake中对这些虚拟表运行查询,就好像数据是本地存储的一样。
在数据云中使用数据仓库的数据 为了说明反过来的情况,想象一家销售家用电器产品的公司。该数据仓库存储了所有在线或实体店购买记录、产品系列中所有产品的信息以及物流链的数据。该公司使用数据云来利用Snowflake中的数据以及关联的客户关系管理系统(CRM)进行营销产品,并利用这些数据更大程度地实现营销活动的个性化。
如何做到这一点呢? 在数据云中,首先必须建立与Snowflake的连接。这里就涉及到“挂载(mounting)”这个术语。数据云可以将表挂载为外部数据对象。简单来说,这意味着数据云创建了一个指向这些数据的虚拟链接。一旦数据在数据云中作为外部对象可用,你就可以继续使用它,就好像你是通过数据流(将数据加载到数据云的常规方式)获取它的一样。
这无疑能让公司提高效率、降低成本并实时获取最新数据。然而,要对各个系统中数据源的管理情况保持清晰的了解可能会更困难。例如,我会思考哪些用户应该有哪些权限,以及应该能够访问哪些数据。也有可能出现这样的情况:如果网络连接出现故障,或者需要通过多个数据源进行复杂的查询请求,就会产生延迟。