我正在尝试在Amazon Athena上建立技能。我已经成功使用Athena查询JSON和Apache Parquet格式的数据。我现在想做的是向其中添加压缩(gzip)。
我的JSON数据:
{
"id": 1,
"prenom": "Firstname",
"nom": "Lastname",
"age": 23
}
然后,我使用npm模块将JSON转换为Apache Parquet格式:https ://www.npmjs.com/package/parquetjs
最后,我将GZIP格式的实木复合地板文件压缩并放入s3存储桶:test-athena-personnes。
我的雅典娜表:
CREATE EXTERNAL TABLE IF NOT EXISTS personnes (
id INT,
nom STRING,
prenom STRING,
age INT
)
STORED AS PARQUET
LOCATION 's3://test-athena-personnes/'
tblproperties ("parquet.compress"="GZIP");
然后,为了测试它,我启动了一个非常简单的请求: Select * from personnes;
我收到错误消息:
HIVE_CANNOT_OPEN_SPLIT: Error opening Hive split s3://test-athena-personnes/personne1.parquet.gz (offset=0, length=257): Not valid Parquet file: s3://test-athena-personnes/personne1.parquet.gz expected magic number: [80, 65, 82, 49] got: [-75, 1, 0, 0]
有什么我不理解的或者我做得不好吗?我可以在不使用gzip压缩的情况下请求apache实木复合地板文件,但不能使用它。
先感谢您
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您描述的问题,看起来主要问题在于您直接将GZIP压缩的Parquet文件提供给了Amazon Athena查询,而Athena在尝试读取该文件时期望的是未压缩的Parquet格式或者正确处理过的压缩文件。当您手动压缩Parquet文件为gzip格式后,直接更改表的存储属性来声明使用GZIP压缩可能并不足以让Athena正确解压和读取。
Amazon Athena本身支持读取存储为GZIP压缩格式的Parquet文件,但关键在于文件需要是正确的Parquet格式且被正确地GZIP压缩。通常,生成Parquet文件时指定压缩方式(如在创建Parquet文件时直接设置GZIP压缩),而不是先创建Parquet文件再单独进行GZIP压缩,因为这样可能会破坏Parquet文件头,导致Athena无法识别。
parquetjs
库,您应该在写入Parquet文件时直接指定压缩方法,而不是之后单独压缩文件。例如,使用如下代码片段:const parquet = require('parquetjs');
// 创建Parquet schema
const schema = new parquet.ParquetSchema({
id: { type: 'INT64' },
prenom: { type: 'UTF8' },
nom: { type: 'UTF8' },
age: { type: 'INT32' },
});
// 写入Parquet文件并直接压缩为GZIP
const writer = await parquet.ParquetWriter.openFile(schema, 's3://test-athena-personnes/personne1.parquet', {
compression: 'gzip', // 直接在此处指定压缩方式
});
确保您的S3路径不包含.gz
扩展名,因为Athena会自动处理压缩格式,不需要文件名指示压缩类型。
更新表定义:如果上述步骤正确执行,理论上您不需要在CREATE TABLE
语句中显式指定tblproperties ("parquet.compress"="GZIP")
,因为压缩已经在写入Parquet文件时完成。但是,保持这个设置也不会造成错误,它只是重申了压缩信息。
验证与测试:重新运行您的查询SELECT * FROM personnes;
,此时应该能够成功读取数据,因为Parquet文件现在是按照Athena期望的方式压缩的。
请尝试以上解决方案,并检查是否解决了您的问题。