将数据从流分析输出到 powerbi 时数据被覆盖
data being overwritten when outputting data from stream analytics to powerbi
最近,我一直在研究使用 PowerBI 作为输出接收器的流分析查询。我做了一个简单的查询,它检索了一段时间内我们网站请求的 http 响应代码总数,并按日期和响应代码对它们进行分组。
输入数据是从保存 BLOB 存储的存储帐户中检索的。这是我的查询:
SELECT
DATETIMEFROMPARTS(DATEPART(year,R.context.data.eventTime), DATEPART(month,R.context.data.eventTime),DATEPART(day,R.context.data.eventTime),0,0,0,0) as datum,
request.ArrayValue.responseCode,
count(request.ArrayValue.responseCode)
INTO
[requests-httpresponsecode]
FROM
[cvweu-internet-pr-sa-requests] R TIMESTAMP BY R.context.data.eventTime
OUTER APPLY GetArrayElements(R.request) as request
GROUP BY DATETIMEFROMPARTS(DATEPART(year,R.context.data.eventTime), DATEPART(month,R.context.data.eventTime),DATEPART(day,R.context.data.eventTime),0,0,0,0), request.ArrayValue.responseCode, System.TimeStamp
由于continuous export在2018年9月3日激活,我选择了一个工作开始时间2018年9月3日。由于直到今天我才对统计感兴趣,所以我没有包括日期间隔所以我期待看到数据从2018年9月3日到现在(2018年12月20日)。这项工作 运行 很好,没有错误,我选择 PowerBI 作为输出接收器。我立即看到图表从 9 月 3 日开始按天分组并计数。到目前为止,一切都很好。几天后,我注意到输出数据集不再是从 9 月 3 日开始,而是从 12 月 2 日到现在。显然数据正在被覆盖。
以下link表示:
https://docs.microsoft.com/en-us/azure/stream-analytics/stream-analytics-power-bi-dashboard
"defaultRetentionPolicy: BasicFIFO: 数据是FIFO,最多20万行。"
但是我的输出 table 没有接近 200.000 行:
datum,count,responsecode
2018-12-02 00:00:00,332348,527387
2018-12-03 00:00:00,3178250,3282791
2018-12-04 00:00:00,3170981,4236046
2018-12-05 00:00:00,2943513,3911390
2018-12-06 00:00:00,2966448,3914963
2018-12-07 00:00:00,2825741,3999027
2018-12-08 00:00:00,1621555,3353481
2018-12-09 00:00:00,2278784,3706966
2018-12-10 00:00:00,3160370,3911582
2018-12-11 00:00:00,3806272,3681742
2018-12-12 00:00:00,4402169,3751960
2018-12-13 00:00:00,2924212,3733805
2018-12-14 00:00:00,2815931,3618851
2018-12-15 00:00:00,1954330,3240276
2018-12-16 00:00:00,2327456,3375378
2018-12-17 00:00:00,3321780,3794147
2018-12-18 00:00:00,3229474,4335080
2018-12-19 00:00:00,3329212,4269236
2018-12-20 00:00:00,651642,1195501
编辑:我已经根据以下内容创建了 STREAM 输入源
https://docs.microsoft.com/en-us/azure/stream-analytics/stream-analytics-quick-create-portal. I can create a REFERENCE input as well, but this invalidates my query since APPLY and GROUP BY are not supported and I also think STREAM input is what I want according to https://docs.microsoft.com/en-us/azure/stream-analytics/stream-analytics-add-inputs.
我错过了什么?是我的查询吗?
您似乎正在直播 Streaming dataset。流式数据集不会将数据存储在数据库中,而只会保留最后一小时的数据。如果你想保持数据推送到它,那么你必须在创建数据集时启用 Historic data analysis
选项:
这将创建 PushStreaming 数据集(a.k.a。混合),具有基本的 FIFO 保留策略(即保留大约 200k-210k 条记录)。
你说得对,Azure 流分析应该创建 "PushStreaming" 或 "Hybrid" 数据集。您能否确认您的数据集已正确配置为 "Hybrid"(您甚至可以在创建后检查此属性 as shown here)?
如果是正确的类型,能否请您澄清以下几点:
您的数据架构是否发生变化?例如,如果你发送数据 {a: 1, b: 2}
,然后发送数据 {c: 3, d: 4}
,Azure 流分析将尝试更改你的 table 的架构,这会使旧数据无效。
您如何确认数据集中的行数?
看来问题出在我的查询上。我不得不使用 TUMBLINGWINDOW(day,1) 而不是 System.TimeStamp。
TUMBLINGWINDOW 和 System.TimeStamp 在前端产生完全相同的图表输出,但在后端似乎以不同的方式处理。这并没有以任何方式反映到前端,所以这很令人困惑。我怀疑由于不使用 TUMBLINGWINDOW 时处理查询的方式,后端发生了一些事情,并且您碰巧比预期更快地达到了每个数据集 200k 行的限制。下面的查询是产生预期结果的查询。
SELECT
request.ArrayValue.responseCode,
count(request.ArrayValue.responseCode),
DATETIMEFROMPARTS(DATEPART(year,R.context.data.eventTime), DATEPART(month,R.context.data.eventTime),DATEPART(day,R.context.data.eventTime),0,0,0,0) as date
INTO
[requests-httpstatuscode]
FROM
[cvweu-internet-pr-sa-requests] R TIMESTAMP BY R.context.data.eventTime
OUTER APPLY GetArrayElements(R.request) as request
GROUP BY DATETIMEFROMPARTS(DATEPART(year,R.context.data.eventTime), DATEPART(month,R.context.data.eventTime),DATEPART(day,R.context.data.eventTime),0,0,0,0),
TUMBLINGWINDOW(day,1),
request.ArrayValue.responseCode
正如我们所说,我的流分析工作 运行 顺利地产生了从 9 月 3 日到现在的预期输出,没有数据被覆盖。
最近,我一直在研究使用 PowerBI 作为输出接收器的流分析查询。我做了一个简单的查询,它检索了一段时间内我们网站请求的 http 响应代码总数,并按日期和响应代码对它们进行分组。 输入数据是从保存 BLOB 存储的存储帐户中检索的。这是我的查询:
SELECT
DATETIMEFROMPARTS(DATEPART(year,R.context.data.eventTime), DATEPART(month,R.context.data.eventTime),DATEPART(day,R.context.data.eventTime),0,0,0,0) as datum,
request.ArrayValue.responseCode,
count(request.ArrayValue.responseCode)
INTO
[requests-httpresponsecode]
FROM
[cvweu-internet-pr-sa-requests] R TIMESTAMP BY R.context.data.eventTime
OUTER APPLY GetArrayElements(R.request) as request
GROUP BY DATETIMEFROMPARTS(DATEPART(year,R.context.data.eventTime), DATEPART(month,R.context.data.eventTime),DATEPART(day,R.context.data.eventTime),0,0,0,0), request.ArrayValue.responseCode, System.TimeStamp
由于continuous export在2018年9月3日激活,我选择了一个工作开始时间2018年9月3日。由于直到今天我才对统计感兴趣,所以我没有包括日期间隔所以我期待看到数据从2018年9月3日到现在(2018年12月20日)。这项工作 运行 很好,没有错误,我选择 PowerBI 作为输出接收器。我立即看到图表从 9 月 3 日开始按天分组并计数。到目前为止,一切都很好。几天后,我注意到输出数据集不再是从 9 月 3 日开始,而是从 12 月 2 日到现在。显然数据正在被覆盖。
以下link表示:
https://docs.microsoft.com/en-us/azure/stream-analytics/stream-analytics-power-bi-dashboard
"defaultRetentionPolicy: BasicFIFO: 数据是FIFO,最多20万行。"
但是我的输出 table 没有接近 200.000 行:
datum,count,responsecode
2018-12-02 00:00:00,332348,527387
2018-12-03 00:00:00,3178250,3282791
2018-12-04 00:00:00,3170981,4236046
2018-12-05 00:00:00,2943513,3911390
2018-12-06 00:00:00,2966448,3914963
2018-12-07 00:00:00,2825741,3999027
2018-12-08 00:00:00,1621555,3353481
2018-12-09 00:00:00,2278784,3706966
2018-12-10 00:00:00,3160370,3911582
2018-12-11 00:00:00,3806272,3681742
2018-12-12 00:00:00,4402169,3751960
2018-12-13 00:00:00,2924212,3733805
2018-12-14 00:00:00,2815931,3618851
2018-12-15 00:00:00,1954330,3240276
2018-12-16 00:00:00,2327456,3375378
2018-12-17 00:00:00,3321780,3794147
2018-12-18 00:00:00,3229474,4335080
2018-12-19 00:00:00,3329212,4269236
2018-12-20 00:00:00,651642,1195501
编辑:我已经根据以下内容创建了 STREAM 输入源 https://docs.microsoft.com/en-us/azure/stream-analytics/stream-analytics-quick-create-portal. I can create a REFERENCE input as well, but this invalidates my query since APPLY and GROUP BY are not supported and I also think STREAM input is what I want according to https://docs.microsoft.com/en-us/azure/stream-analytics/stream-analytics-add-inputs.
我错过了什么?是我的查询吗?
您似乎正在直播 Streaming dataset。流式数据集不会将数据存储在数据库中,而只会保留最后一小时的数据。如果你想保持数据推送到它,那么你必须在创建数据集时启用 Historic data analysis
选项:
这将创建 PushStreaming 数据集(a.k.a。混合),具有基本的 FIFO 保留策略(即保留大约 200k-210k 条记录)。
你说得对,Azure 流分析应该创建 "PushStreaming" 或 "Hybrid" 数据集。您能否确认您的数据集已正确配置为 "Hybrid"(您甚至可以在创建后检查此属性 as shown here)?
如果是正确的类型,能否请您澄清以下几点:
您的数据架构是否发生变化?例如,如果你发送数据
{a: 1, b: 2}
,然后发送数据{c: 3, d: 4}
,Azure 流分析将尝试更改你的 table 的架构,这会使旧数据无效。您如何确认数据集中的行数?
看来问题出在我的查询上。我不得不使用 TUMBLINGWINDOW(day,1) 而不是 System.TimeStamp。
TUMBLINGWINDOW 和 System.TimeStamp 在前端产生完全相同的图表输出,但在后端似乎以不同的方式处理。这并没有以任何方式反映到前端,所以这很令人困惑。我怀疑由于不使用 TUMBLINGWINDOW 时处理查询的方式,后端发生了一些事情,并且您碰巧比预期更快地达到了每个数据集 200k 行的限制。下面的查询是产生预期结果的查询。
SELECT
request.ArrayValue.responseCode,
count(request.ArrayValue.responseCode),
DATETIMEFROMPARTS(DATEPART(year,R.context.data.eventTime), DATEPART(month,R.context.data.eventTime),DATEPART(day,R.context.data.eventTime),0,0,0,0) as date
INTO
[requests-httpstatuscode]
FROM
[cvweu-internet-pr-sa-requests] R TIMESTAMP BY R.context.data.eventTime
OUTER APPLY GetArrayElements(R.request) as request
GROUP BY DATETIMEFROMPARTS(DATEPART(year,R.context.data.eventTime), DATEPART(month,R.context.data.eventTime),DATEPART(day,R.context.data.eventTime),0,0,0,0),
TUMBLINGWINDOW(day,1),
request.ArrayValue.responseCode
正如我们所说,我的流分析工作 运行 顺利地产生了从 9 月 3 日到现在的预期输出,没有数据被覆盖。