如何在 Amazon Athena 中转换数据

How to transform data in Amazon Athena

我在 S3 位置有一些 json 格式的数据。它有 4 列 valtime__stampnametype。我想通过下面给出的一些转换从这些数据创建一个外部 Athena table:

  1. timestamp: timestamp 应该从 unix epoch 转换为 UTC,这是我使用 timestamp 数据类型完成的。
  2. name:名称应使用以下 sql 逻辑进行过滤:
    name not in ('abc','cdf','fgh') and name not like '%operator%'
  3. type:类型不应具有标记为 counter
  4. 的值
  5. 我想添加两个分区列 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

可能最简单的方法是创建视图:

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'