开发者社区 问答 正文

Amazon AWS Athena HIVE_CANNOT_OPEN_SPLIT:打开Hive拆分时

我正在尝试在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实木复合地板文件,但不能使用它。

先感谢您

展开
收起
几许相思几点泪 2019-12-17 18:17:15 1739 分享 版权
阿里云 AI 助理回答

根据您描述的问题,看起来主要问题在于您直接将GZIP压缩的Parquet文件提供给了Amazon Athena查询,而Athena在尝试读取该文件时期望的是未压缩的Parquet格式或者正确处理过的压缩文件。当您手动压缩Parquet文件为gzip格式后,直接更改表的存储属性来声明使用GZIP压缩可能并不足以让Athena正确解压和读取。

Amazon Athena本身支持读取存储为GZIP压缩格式的Parquet文件,但关键在于文件需要是正确的Parquet格式且被正确地GZIP压缩。通常,生成Parquet文件时指定压缩方式(如在创建Parquet文件时直接设置GZIP压缩),而不是先创建Parquet文件再单独进行GZIP压缩,因为这样可能会破坏Parquet文件头,导致Athena无法识别。

解决方案:

  1. 直接在生成Parquet文件时应用压缩:如果您使用的是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会自动处理压缩格式,不需要文件名指示压缩类型。

  1. 更新表定义:如果上述步骤正确执行,理论上您不需要在CREATE TABLE语句中显式指定tblproperties ("parquet.compress"="GZIP"),因为压缩已经在写入Parquet文件时完成。但是,保持这个设置也不会造成错误,它只是重申了压缩信息。

  2. 验证与测试:重新运行您的查询SELECT * FROM personnes;,此时应该能够成功读取数据,因为Parquet文件现在是按照Athena期望的方式压缩的。

请尝试以上解决方案,并检查是否解决了您的问题。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答标签:
问答地址: