電動汽車站數據教程(預覽版) - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

電動汽車站數據教程(預覽版)

以下是 Amazon Redshift 流媒體攝入的公共預覽版文檔,該文檔使用 Kinesis 數據流中的數據。預覽功能是在 Redshift 中構建和測試的,但所有用例的測試覆蓋範圍可能不完整。在公開發佈之前,本文件和功能會隨時變更。我們建議僅搭配測試集羣使用此功能,不要在生產環境中使用。有關預覽條款和條件,請參閲Beta 版服務參與AWS服務條款

此過程演示如何從名為電子站數據,其中包含來自不同 EV 充電站的消耗數據,採用 JSON 格式。模式定義得很好。該示例説明如何將數據存儲為原始 JSON,以及如何在攝入時將 JSON 數據轉換為 Amazon Redshift 數據類型。

生產者設定

  1. 使用 Amazon Kinesis Data Streams,按照步驟創建名為ev_station_data。選擇隨需(針對)容量模式。如需詳細資訊,請參閱「」建立串流AWS管理主控台

  2. 所以此Amazon Kinesis 資料生成器可以幫助您生成測試數據以與流一起使用。按照工具中詳細説明的步驟開始使用,並使用以下數據模板生成數據:

    { "_id" : "{{random.uuid}}", "clusterID": "{{random.number( { "min":1, "max":50 } )}}", "connectionTime": "{{date.now("YYYY-MM-DD HH:mm:ss")}}", "kWhDelivered": "{{commerce.price}}", "stationID": "{{random.number( { "min":1, "max":467 } )}}", "spaceID": "{{random.word}}-{{random.number( { "min":1, "max":20 } )}}", "timezone": "America/Los_Angeles", "userID": "{{random.number( { "min":1000, "max":500000 } )}}" }

    串流資料中的每個 JSON 物件都具有下列屬性:

    { "_id": "12084f2f-fc41-41fb-a218-8cc1ac6146eb", "clusterID": "49", "connectionTime": "2022-01-31 13:17:15", "kWhDelivered": "74.00", "stationID": "421", "spaceID": "technologies-2", "timezone": "America/Los_Angeles", "userID": "482329" }

Amazon Redshift 設定

以下步驟會示範如何將具體化檢視配置為接收資料。

  1. 創建外部架構以將數據從 Kinesis 映射到 Redshift 對象。

    CREATE EXTERNAL SCHEMA evdata FROM KINESIS IAM_ROLE 'arn:aws:iam::0123456789:role/redshift-streaming-role';

    如需如何設定 IAM 角色的資訊,請參串流入門

  2. 創建實例化視圖以使用流數據。以下示例顯示了定義實例化視圖以接收 JSON 源數據的兩種方法。

    首先,以半結構化 SUPER 格式存儲流記錄。在此示例中,JSON 源存儲在 Redshift 中,而不轉換為 Redshift 類型。

    CREATE MATERIALIZED VIEW ev_station_data AS SELECT approximatearrivaltimestamp, partitionkey, shardid, sequencenumber, json_parse(from_varbyte(data, 'utf-8')) as payload FROM evdata."ev_station_data";

    相比之下,在以下實例化視圖定義中,實例化視圖在 Redshift 中具有定義的架構。實例化視圖分佈在流的 UUID 值上,並按approximatearrivaltimestamp值。

    CREATE MATERIALIZED VIEW ev_station_data_extract DISTKEY(5) sortkey(1) AS SELECT approximatearrivaltimestamp, partitionkey, shardid, sequencenumber, json_extract_path_text(from_varbyte(data, 'utf-8'),'_id')::character(36) as ID, json_extract_path_text(from_varbyte(data, 'utf-8'),'clusterID')::varchar(30) as clusterID, json_extract_path_text(from_varbyte(data, 'utf-8'),'connectionTime')::varchar(20) as connectionTime, json_extract_path_text(from_varbyte(data, 'utf-8'),'kWhDelivered')::DECIMAL(10,2) as kWhDelivered, json_extract_path_text(from_varbyte(data, 'utf-8'),'stationID')::DECIMAL(10,2) as stationID, json_extract_path_text(from_varbyte(data, 'utf-8'),'spaceID')::varchar(100) as spaceID, json_extract_path_text(from_varbyte(data, 'utf-8'),'timezone')::varchar(30) as timezone, json_extract_path_text(from_varbyte(data, 'utf-8'),'userID')::varchar(30) as userID FROM evdata."ev_station_data";
  3. 重新整理具體化檢視。

    REFRESH MATERIALIZED VIEW ev_station_data_extract;

查詢串流

  1. 查詢刷新的實體化視圖以獲取使用情況統計信息。

    SELECT to_timestamp(connectionTime, 'YYYY-MM-DD HH24:MI:SS') as connectiontime ,SUM(kWhDelivered) AS Energy_Consumed ,count(distinct userID) AS #Users from ev_station_data_extract group by to_timestamp(connectionTime, 'YYYY-MM-DD HH24:MI:SS') order by 1 desc;
  2. 查看結果。

    connectiontime energy_consumed #users 2022-02-08 16:07:21+00 4139 10 2022-02-08 16:07:20+00 5571 10 2022-02-08 16:07:19+00 8697 20 2022-02-08 16:07:18+00 4408 10 2022-02-08 16:07:17+00 4257 10 2022-02-08 16:07:16+00 6861 10 2022-02-08 16:07:15+00 5643 10 2022-02-08 16:07:14+00 3677 10 2022-02-08 16:07:13+00 4673 10 2022-02-08 16:07:11+00 9689 20