无法从 S3 存储桶(镶木地板文件)将数据加载到 EMR 上的猪中

Posted

技术标签:

【中文标题】无法从 S3 存储桶(镶木地板文件)将数据加载到 EMR 上的猪中【英文标题】:Not able to load data into pig on EMR from S3 bucket (parquet file) 【发布时间】:2018-11-13 17:26:56 【问题描述】:

我想在 EMR 上的 Pig 中从 s3 存储桶加载数据,我的源文件格式是 parquet:

我使用过的以下命令:

A = LOAD 's3://test-1/icted/emp_db/emp_tb' 
USING parquet.pig.ParquetLoader(header__change_seq:chararray,header__change_oper:chararray,header__change_mask:chararray,header__stream_position:chararray,header__operation:chararray,header__transaction_id:chararray,header__timestamp:chararray,policylangaccessind_afi:chararray,loadcommandid:double,previousgroupid:double,enddate:chararray,assignedbyuserid:double,dstcd_afi:chararray);

我无法加载下面的数据是错误:

      ERROR pig.PigServer: exception during parsing: Error during parsing. <file test.pig, line 20, column 2>  mismatched input 'header__change_seq' expecting RIGHT_PAREN

在这方面需要帮助。

【问题讨论】:

【参考方案1】:

几件事:

您应该在 emr org.apache.parquet.pig.ParquetLoader() 上使用完整的类路径;无需传递模式,拼花阅读器会为您推断。

确保您使用的pig代码版本与parquet文件的版本兼容(parquet工具可用于查找使用的parquet版本)

尝试使用最新版本https://mvnrepository.com/artifact/org.apache.parquet/parquet-pig-bundle/1.10.0

REGISTER parquet-pig-bundle-1.10.0.jar;

【讨论】:

【参考方案2】:

缺少''

A = LOAD 's3://test-1/icted/emp_db/emp_tb' USING parquet.pig.ParquetLoader('header__change_seq:chararray,header__change_oper:chararray,header__change_mask:chararray,header__stream_position:chararray,header__operation:chararray,header__transaction_id:chararray,header__timestamp:chararray,policylangaccessind_afi:chararray,loadcommandid:double,previousgroupid:double,enddate:chararray,assignedbyuserid:double,dstcd_afi:chararray');

或者

ParquetLoader 之后缺少as

A = LOAD 's3://test-1/icted/emp_db/emp_tb' USING parquet.pig.ParquetLoader AS (header__change_seq:chararray,header__change_oper:chararray,header__change_mask:chararray,header__stream_position:chararray,header__operation:chararray,header__transaction_id:chararray,header__timestamp:chararray,policylangaccessind_afi:chararray,loadcommandid:double,previousgroupid:double,enddate:chararray,assignedbyuserid:double,dstcd_afi:chararray);

【讨论】:

感谢您的回复,我在第一个选项中遇到错误,errorMessage=java.lang.IllegalArgumentException:架构大小不匹配:消息 spark_schema optional binary header__change_seq (UTF8);可选二进制标头__change_oper (UTF8);可选二进制标头__change_mask (UTF8);可选二进制标头__stream_position (UTF8);可选的二进制标头__操作(UTF8);可选的二进制标头__transaction_id (UTF8);可选的 int96 header__timestamp; 对于第二个选项---->7153 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1200: can't convert optional int96 header__timestamp 我对 EMR 很陌生,但您的回复对我有很大帮助。

以上是关于无法从 S3 存储桶(镶木地板文件)将数据加载到 EMR 上的猪中的主要内容,如果未能解决你的问题,请参考以下文章

将大型 Spark 数据帧作为镶木地板写入 s3 存储桶

使用 pyspark 将镶木地板文件(在 aws s3 中)存储到 spark 数据框中

使用 pyspark 从 s3 位置读取镶木地板文件的文件夹到 pyspark 数据帧

如何将镶木地板文件从 s3 导入到 postgresql rds

转换为镶木地板的 csv 文件将“e0”添加到值的末尾

EMR 5.28 无法在 s3 上加载镶木地板文件