在 Azure Synapse 中将 .parquet 文件 varchar 列转换为日期时间

Posted

技术标签:

【中文标题】在 Azure Synapse 中将 .parquet 文件 varchar 列转换为日期时间【英文标题】:Transform .parquet file varchar column to datetime in Azure Synapse 【发布时间】:2022-01-09 10:57:05 【问题描述】:

我正在以 .parquet 文件的形式将 JSON 遥测数据从我们的 IoT 中心发送到 Azure Data Lake Gen2。然后,我从数据湖中在我的 Azure Synapse Serverless SQL 池中创建了一个视图,我可以连接到该视图并查询数据以获取报告。

CREATE VIEW DeviceTelemetryView
AS SELECT * FROM
    OPENROWSET(
        BULK 'https://test123.dfs.core.windows.net/devicetelemetry/*/*/*/*/*/',
        FORMAT = 'PARQUET'
    ) AS [result]

这是我的视图数据的样子:

这些报告中的大多数都基于日期时间范围。因此,我希望能够编写使用我的日期时间戳的 SQL 查询。

当前问题

当我查看 dateTimeStamp 列的当前数据类型时,它默认为 varchar(8000),即使我相信我的 JSON 是正确的日期时间格式:"2021-11-29T21:45:00" 。如何在我的视图中将此特定字段转换为日期时间字段以对其运行查询?

【问题讨论】:

【参考方案1】:

当我查看 dateTimeStamp 列的当前数据类型时,它默认为 varchar(8000)

我认为您必须查看 parquet 文件中该列的数据类型,在您的情况下它可能是一个字符串。 sql 解释为 varchar(8000)。

即使我相信我的 JSON 是正确的日期时间格式:“2021-11-29T21:45:00”。

即使时间戳格式正确,我认为您也必须提示系统,以便它知道将该字符串转换为日期时间

如何在我的视图中将此特定字段转换为日期时间字段以对其运行查询?

我不是 sql 专家,但我认为您可以使用 cast and convert 将字符串转换为时间戳

CREATE VIEW DeviceTelemetryView
AS SELECT corporationid, deviceid, version, Convert(datetime, dateTimestamp, 126) AS NewDateFormat, data FROM
    OPENROWSET(
        BULK 'https://test123.dfs.core.windows.net/devicetelemetry/*/*/*/*/*/',
        FORMAT = 'PARQUET'
    ) AS [result]

【讨论】:

是的,转换成功了!虽然我不得不稍微更新转换部分如下:Convert(datetime, dateTimestamp, 126) AS NewDateFormat。 -- CONVERT 语法:CONVERT (data_type [(length)], expression [, style])。如果您可以更新您的答案,我将标记为已接受

以上是关于在 Azure Synapse 中将 .parquet 文件 varchar 列转换为日期时间的主要内容,如果未能解决你的问题,请参考以下文章

在 azure synapse 存储过程中将表名作为参数传递时将查询结果分配给变量

从 Azure Sql 迁移到 Azure Synapse,无法连接到 Airflow 中的 Synapse

Azure Synapse Sql 池未从 Azure Synapse Studio 数据流接收数据

Azure Synapse 专用 sql 池未在 Synapse Studio 中显示数据对象

Azure Synapse 管道:如何将增量更新从 SQL Server 移动到 Synapse 以处理数字

如何在 Synapse (Azure SQL DW) 上检索视图定义?