Come utilizzare prefissi personalizzati e partizionamento dinamico
Firehose può essere configurato con prefissi personalizzati e partizionamento dinamico. Grazie a queste funzionalità, è possibile configurare le chiavi Amazon S3 e impostare schemi di partizionamento che supportano meglio il proprio caso d'uso. È inoltre possibile utilizzare la proiezione delle partizioni con questi schemi di partizionamento e configurarli di conseguenza.
Ad esempio, è possibile utilizzare la funzione di prefisso personalizzato per ottenere chiavi Amazon S3 con date formattate in ISO anziché lo schema yyyy/MM/dd/HH di default.
È inoltre possibile combinare i prefissi personalizzati con il partizionamento dinamico per estrarre una proprietà come customer_id dai messaggi Firehose, come nell'esempio seguente.
prefix/!{timestamp:yyyy}-!{timestamp:MM}-!{timestamp:dd}/!{partitionKeyFromQuery:customer_id}/
Con quel prefisso Amazon S3, il flusso di consegna di Firehose scriverebbe oggetti su chiavi come s3://amzn-s3-demo-bucket/prefix/2021-11-01/customer-1234/file.extension. Per una proprietà come customer_id dove i valori potrebbero non essere noti in anticipo, è possibile utilizzare il tipo di proiezione della partizione injected e usare un'istruzione CREATE TABLE come la seguente:
CREATE EXTERNAL TABLE my_ingested_data3 ( ... ) ... PARTITIONED BY ( day STRING, customer_id STRING ) LOCATION "s3://amzn-s3-demo-bucket/prefix/" TBLPROPERTIES ( "projection.enabled" = "true", "projection.day.type" = "date", "projection.day.format" = "yyyy-MM-dd", "projection.day.range" = "2021-01-01,NOW", "projection.day.interval" = "1", "projection.day.interval.unit" = "DAYS", "projection.customer_id.type" = "injected", "storage.location.template" = "s3://amzn-s3-demo-bucket/prefix/${day}/${customer_id}/" )
Quando si esegue una query su una tabella con una chiave di partizione di tipo injected, la query deve includere un valore per quella chiave di partizione. Una query per la tabella my_ingested_data3 potrebbe essere simile alla seguente:
SELECT * FROM my_ingested_data3 WHERE day BETWEEN '2021-11-01' AND '2021-11-30' AND customer_id = 'customer-1234'
Utilizzare il tipo DATE per la chiave di partizione del giorno
Perché i valori per la chiave di partizione day sono formattati in ISO, è anche possibile utilizzare il tipo DATE per la chiave di partizione del giorno invece di STRING, come nel seguente esempio:
PARTITIONED BY (day DATE, customer_id STRING)
Quando si esegue una query, questa strategia consente di utilizzare le funzioni data sulla chiave di partizione senza analizzare o eseguire il casting, come nell'esempio seguente:
SELECT * FROM my_ingested_data3 WHERE day > CURRENT_DATE - INTERVAL '7' DAY AND customer_id = 'customer-1234'
Nota
La specificazione di una chiave di partizione di tipo DATE presuppone che per creare chiavi Amazon S3 con date in formato ISO sia stata utilizzata la funzionalità di prefisso personalizzato. Se utilizzi il formato predefinito di Firehose yyyy/MM/dd/HH, è necessario specificare la chiave di partizione di tipo string anche se la proprietà della tabella corrispondente è di tipo date, come mostra il seguente esempio:
PARTITIONED BY ( `mydate` string) TBLPROPERTIES ( 'projection.enabled'='true', ... 'projection.mydate.type'='date', 'storage.location.template'='s3://amzn-s3-demo-bucket/prefix/${mydate}')