Amazon web services 将AWS S3中的数据转换为另一个模式结构(也在S3中)
这是一个相当初级的问题- 我将日志数据存储在S3文件中,采用压缩JSON格式。 这些文件位于反映分区的目录层次结构中,其方式如下:Amazon web services 将AWS S3中的数据转换为另一个模式结构(也在S3中),amazon-web-services,amazon-s3,amazon-emr,Amazon Web Services,Amazon S3,Amazon Emr,这是一个相当初级的问题- 我将日志数据存储在S3文件中,采用压缩JSON格式。 这些文件位于反映分区的目录层次结构中,其方式如下:s3://bucket\u name/year=2018/month=201805/day=201805/some\u more\u partitions/file.json.gz 我最近将日志记录的模式更改为稍微不同的目录结构。我添加了更多的分区级别,这些字段当前位于JSON内部,我想将它们移动到文件夹层次结构中。另外,我稍微更改了内部JSON模式。它们位于不同的S
s3://bucket\u name/year=2018/month=201805/day=201805/some\u more\u partitions/file.json.gz
我最近将日志记录的模式更改为稍微不同的目录结构。我添加了更多的分区级别,这些字段当前位于JSON内部,我想将它们移动到文件夹层次结构中。另外,我稍微更改了内部JSON模式。它们位于不同的S3存储桶中
我希望将旧日志转换为新格式,因为我有新模式结构上的Athena映射
AWS EMR是这方面的工具吗?如果是这样,最简单的方法是什么?我想我需要一个类型为step execution
的EMR集群,但它可能只创建一个输出文件,不是吗
谢谢是的,亚马逊EMR是一个合适的工具 您可以使用Hive,它的ish语法与Athena相似:
- 使用旧模式创建指向现有数据的外部表
- 使用新模式创建一个外部表,指向要存储数据的位置
插入新表从旧表中选择*
请参阅:是的,Amazon EMR是一个合适的工具 您可以使用Hive,它的ish语法与Athena相似:
- 使用旧模式创建指向现有数据的外部表
- 使用新模式创建一个外部表,指向要存储数据的位置
插入新表从旧表中选择*
请参阅:是,EMR可用于此类转换 下面是将csv(stg文件夹又名源文件夹)格式的数据转换为orc文件格式的示例代码。如果暂存(也称为源)文件和目标文件之间存在重叠分区,则可能需要执行插入覆盖
DROP TABLE IF EXISTS db_stg.stg_table;
CREATE EXTERNAL TABLE `db_stg.stg_table`(
GEO_KEY string,
WK_BEG_DT string,
FIS_WK_NUM Double,
AMOUNT1 Double
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LOCATION
's3://bucket.name/stg_folder_name/'
TBLPROPERTIES ('has_encrypted_data'='false');
drop table db_tgt.target_table;
CREATE EXTERNAL TABLE db_tgt.target_table(
GEO_KEY string,
FIS_WK_NUM Double,
AMOUNT1 Double
)
PARTITIONED BY(FIS_WK_NUM)
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
location 's3://bucket.name/tgt_folder_name/'
TBLPROPERTIES (
'orc.compress'='SNAPPY');
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table db_tgt.target_table partition(FIS_WK_NUM)
select
GEO_KEY ,
WK_BEG_DT ,
FIS_WK_NUM ,
AMOUNT1
from db_stg.stg_table;
同意John的观点,转换为柱状文件格式(如Parquet或ORC)以及压缩(如SNAPPY)将为您提供AWS Athena的最佳性能
请记住,使用雅典娜的关键是优化扫描读取的数据量。因此,如果数据是列格式的,并且您正在读取某些分区,那么AWS Athena成本将显著降低。您需要做的就是确保在选择所需分区的Athena查询中使用筛选条件。是EMR可用于此类转换 下面是将csv(stg文件夹又名源文件夹)格式的数据转换为orc文件格式的示例代码。如果暂存(也称为源)文件和目标文件之间存在重叠分区,则可能需要执行插入覆盖
DROP TABLE IF EXISTS db_stg.stg_table;
CREATE EXTERNAL TABLE `db_stg.stg_table`(
GEO_KEY string,
WK_BEG_DT string,
FIS_WK_NUM Double,
AMOUNT1 Double
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LOCATION
's3://bucket.name/stg_folder_name/'
TBLPROPERTIES ('has_encrypted_data'='false');
drop table db_tgt.target_table;
CREATE EXTERNAL TABLE db_tgt.target_table(
GEO_KEY string,
FIS_WK_NUM Double,
AMOUNT1 Double
)
PARTITIONED BY(FIS_WK_NUM)
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
location 's3://bucket.name/tgt_folder_name/'
TBLPROPERTIES (
'orc.compress'='SNAPPY');
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table db_tgt.target_table partition(FIS_WK_NUM)
select
GEO_KEY ,
WK_BEG_DT ,
FIS_WK_NUM ,
AMOUNT1
from db_stg.stg_table;
同意John的观点,转换为柱状文件格式(如Parquet或ORC)以及压缩(如SNAPPY)将为您提供AWS Athena的最佳性能
请记住,使用雅典娜的关键是优化扫描读取的数据量。因此,如果数据是列格式的,并且您正在读取某些分区,那么AWS Athena成本将显著降低。您所需要做的就是确保在Athena查询中使用筛选条件来选择所需的分区。感谢您的回复,在搜索ansewr时,我看到了这一点,即这种方法很慢。。。你会说这仍然是最好的方法吗?这是一个一次性的工作,所以它是否慢并不重要,只要它能给你想要的结果。将数据存储在分区中(最好是拼花地板或Avro)将加快雅典娜的速度并降低雅典娜的成本。感谢您的回复,在搜索ansewr时,我看到了这样一种说法,即这种方法很慢。。。你会说这仍然是最好的方法吗?这是一个一次性的工作,所以它是否慢并不重要,只要它能给你想要的结果。将数据存储在分区中(最好是拼花地板或Avro)将加快Athena的速度,并降低Athena的成本。