簡體   English   中英

如何在 Amazon Athena 中轉換數據

[英]How to transform data in Amazon Athena

我在 S3 位置有一些數據,格式為 json。 它有 4 列valtime__stampnametype 我想通過下面給出的一些轉換從這些數據創建一個外部 Athena 表:

  1. timestamp :timestamp 應該從 unix 紀元轉換為 UTC,這是我使用 timestamp 數據類型完成的。
  2. name :名稱應使用以下 sql 邏輯進行過濾:
    name not in ('abc','cdf','fgh') and name not like '%operator%'
  3. type :類型不應具有標記為counter的值
  4. 我想添加兩個分區列datehour應該從 time__stamp 列派生

我從以下開始:

CREATE EXTERNAL TABLE `airflow_cluster_data`(
  `val` string COMMENT 'from deserializer', 
  `time__stamp` timestamp COMMENT 'from deserializer', 
  `name` string COMMENT 'from deserializer', 
  `type` string COMMENT 'from deserializer')
PARTITIONED BY ( 
  date,
  hour)
ROW FORMAT SERDE 
  'org.openx.data.jsonserde.JsonSerDe' 
WITH SERDEPROPERTIES ( 
  'mapping.time_stamp'='@timestamp') 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://bucket1/raw/airflow_data'

我嘗試了各種方法,但無法弄清楚語法。 使用 spark 本來可以更容易,但我不想每小時為小型數據集運行 Amazon EMR。 如果可能的話,我更喜歡在雅典娜做。

請看一些示例數據:

1533,1636674330000,abc,counter
1533,1636674330000,xyz,timer
1,1636674330000,cde,counter
41,1636674330000,cde,timer
1,1636674330000,fgh,counter
231,1636674330000,xyz,timer
1,1636674330000,abc,counter
2431,1636674330000,cde,counter
42,1636674330000,efg,timer

您可以創建自己的 UDF 進行轉換並在 Athena 中使用它。 https://docs.aws.amazon.com/athena/latest/ug/querying-udf.html

可能最簡單的方法是創建一個 View

CREATE VIEW foo AS
SELECT
  val,
  cast(from_unixtime(time__stamp / 1000) as timestamp) as timestamp,
  cast(from_unixtime(time__stamp / 1000) as date) as date,
  hour(cast(from_unixtime(time__stamp / 1000) as timestamp)) as hour,
  name,
  type
FROM airflow_cluster_data
WHERE name not in ('abc','cdf','fgh')
  AND name not like '%operator%'
  AND type != 'counter'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM