Azure 事件中心捕获的文件通常以以下格式存储:
{Namespace}/{EventHub}/{PartitionId}/{Year}/{Month}/{Day}/{Hour}/{Minute}/{Second}.avro
但是,文件名格式可用的占位符基于协调世界时 (UTC)。如果我位于不同的时区,例如 UTC-8,文件名会很混乱(2023 年 12 月 11 日凌晨 04:00:00 在 UTC-8 捕获的文件将被命名为
{Namespace}/{EventHub}/{PartitionId}/2023/12/10/20/00/00.avro
我可以在名称格式中应用一些函数,以便我可以以反映我自己时区的格式捕获文件吗?如果没有,在 Databricks 中处理这些数据的最佳实践是什么?我能想到的是使用ADF管道捕获并根据时区重命名数据,然后保存到另一个地方,但希望有一些简单的方法。
创建的文件夹结构的时间戳遵循 UTC 而不是本地时间。您无法更改它。
但是,您可以创建一个
JavaScript UDF 将 UTC 转换为本地时区。
转换后,您可以在配置输出时使用路径模式选项中的该列。
下面是JavaScript UDF 的代码。
function main(datetime) {
const d = new Date(datetime);
let tmp = d.toLocaleString('en-US', {
hour12: false,
timeZone: 'America/Los_Angeles'});
let tmp1 = tmp.split(",");
let date = tmp1[0].split("/").reverse().join('/');
let time = tmp1[1].split(':').join('/');
return date.replace(' ','')+"/"+time.replace(' ','');
}
接下来,要进行转换,请在查询编辑器的
select
语句中添加以下语句。
SELECT
udf.convertTolocal(EventEnqueuedUtcTime) AS ConvertedTimestamp,
---your fields
[1e7ed650-1d9e-50b9-0dcd-5db77c7add4c].[EventProcessedUtcTime],
[1e7ed650-1d9e-50b9-0dcd-5db77c7add4c].[PartitionId],
[1e7ed650-1d9e-50b9-0dcd-5db77c7add4c].[EventEnqueuedUtcTime]
INTO [output]
FROM [1e7ed650-1d9e-50b9-0dcd-5db77c7add4c]
这里,convertTolocal
event_out/{ConvertedTimestamp}
ConvertedTimestamp 是列名称。输出:
上一列的输出如下所示。
添加到路径模式后,它将创建文件夹。
以下是在存储中创建的文件夹。
有关 UDF 的更多信息,请参阅
this。