问题描述
我的数据湖中有Web应用程序日志。一些日志条目具有其他字段没有的字段。我可以直接在Synapse中使用此数据,还是必须先使用ADF对其进行规范化以匹配Synapse中的架构?
解决方法
简短的回答是“否”(假设它不是json日志)。您不能使用Azure Synapse的T-SQL加载此类数据。您必须先对其进行转换。
Azure Synapse不仅是一个数据库。它是提供与Analytics(分析)相关的服务的保护伞。 SQL Pool(Synapse DB)就是其中之一。
https://docs.microsoft.com/en-us/azure/synapse-analytics/overview-what-is
它还提供编排功能:https://docs.microsoft.com/en-us/azure/synapse-analytics/get-started-pipelines
这对你来说是个大问题。
- 如果可以,请使用JSON数据类型。它支持预览功能,我怀疑它会扩展(在加载日志后查询日志时)。但理论上可以选择:https://docs.microsoft.com/en-us/sql/t-sql/functions/json-functions-transact-sql?view=azure-sqldw-latest
- 您已经指出:使用ADF(Azure数据工厂)之类的东西来转换日志并加载到Synapse DB中。
- 使用Synapse内置的Spark代替ADF进行相同的操作。 https://docs.microsoft.com/en-us/azure/synapse-analytics/get-started-analyze-spark
- 使用通过Pandas用Python编写的Azure函数,并将http-trigger-binding绑定到datalake进行转换(转换为csv,orc,parquet)。然后使用COPY命令加载到Synapse中。
如果不是一次性的东西,ADF可能会变得昂贵。
,您应该真正了解的一个Azure Synapse功能是SQL on-demand,目前处于预览状态。它可以处理数据湖中的JSON,镶木地板和csv文件。
在数据湖中的同一位置,您是否有不同的Web日志,它们的文件名不同,或者各个文件中的记录不同?如果是前者,则只需编写一个SQL按需T-SQL语句并使用filename
函数对文件名进行过滤,例如:
SELECT
r.filename() AS [filename],*
FROM OPENROWSET(
BULK 'csv/taxi/yellow_tripdata_2017-*.csv',DATA_SOURCE = 'SqlOnDemandDemo',FORMAT = 'CSV',PARSER_VERSION = '2.0',FIRSTROW = 2)
WITH (C1 varchar(200) ) AS [r]
WHERE
r.filename() IN ('yellow_tripdata_2017-10.csv','yellow_tripdata_2017-11.csv','yellow_tripdata_2017-12.csv');
示例查询改编自Microsoft文章here。您可以看到您不必事先知道该模式。
会有一些区别,例如逗号数量,记录开头的某种标识符等,如果是这种情况,请发布更多详细信息和示例数据。