如何在 Amazon Athena 中转换数据
How to transform data in Amazon Athena
我在 S3 位置有一些 json 格式的数据。它有 4 列 val
、time__stamp
、name
和 type
。我想通过下面给出的一些转换从这些数据创建一个外部 Athena table:
timestamp
: timestamp 应该从 unix epoch 转换为 UTC,这是我使用 timestamp 数据类型完成的。
name
:名称应使用以下 sql 逻辑进行过滤:
name not in ('abc','cdf','fgh') and name not like '%operator%'
type
:类型不应具有标记为 counter
的值
- 我想添加两个分区列
date
和 hour
应该派生自 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'
我在 S3 位置有一些 json 格式的数据。它有 4 列 val
、time__stamp
、name
和 type
。我想通过下面给出的一些转换从这些数据创建一个外部 Athena table:
timestamp
: timestamp 应该从 unix epoch 转换为 UTC,这是我使用 timestamp 数据类型完成的。name
:名称应使用以下 sql 逻辑进行过滤:
name not in ('abc','cdf','fgh') and name not like '%operator%'
type
:类型不应具有标记为counter
的值
- 我想添加两个分区列
date
和hour
应该派生自 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'