使用 Pig 脚本将文本文件转换为 avro

Posted

技术标签:

【中文标题】使用 Pig 脚本将文本文件转换为 avro【英文标题】:Convert text file to avro using Pig script 【发布时间】:2015-01-31 05:21:13 【问题描述】:

我正在使用 pig 脚本进行文本文件到 Avro 的转换

`我有一个管道分隔格式的文本文件,位于 /user/hduser/pig_input/abc.dat

1|8|123|985|659856|10000000002546 1|8|123|985|659856|10000000002546 1|8|123|985|659856|10000000002546 1|8|123|985|659856|10000000002546 1|8|123|985|659856|10000000002546

Schema 文件位于 hdfs /user/hduser/pig_schema_files/abc.avsc


  "type" : "record",
  "name" : "import_dummy",
  "doc" : "import_123dummy",
  "fields" : [ 
  "name" : "ID",
  "type" : [ "string", "null" ],
  "columnName" : "ID",
  "sqlType" : "3"
  , 
  "name" : "TRANS_O",
  "type" : [ "string", "null" ],
  "columnName" : "TRANS_O",
  "sqlType" : "3"
 , 
 "name" : "CARD_O",
 "type" : [ "string", "null" ],
 "columnName" : "CARD_O",
 "sqlType" : "3"
 , 
 "name" : "SEQ_O",
 "type" : [ "string", "null" ],
 "columnName" : "SEQ_O",
 "sqlType" : "1"
 , 
 "name" : "DATE_O",
 "type" : [ "string", "null" ],
 "columnName" : "DATE_O",
 "sqlType" : "3"
 ],"tableName" : "123dummy"

以下是我写的脚本

REGISTER /app/cloudera/parcels/CDH/lib/pig/piggybank.jar
REGISTER /app/cloudera/parcels/CDH/lib/pig/lib/avro-1.3.7.jar
REGISTER /app/cloudera/parcels/CDH/lib/pig/lib/jackson-core-asl.jar
REGISTER /app/cloudera/parcels/CDH/lib/pig/lib/jackson-mapper-asl.jar
REGISTER /app/cloudera/parcels/CDH/lib/pig/lib/json-simple.jar
REGISTER /app/cloudera/parcels/CDH/lib/pig/lib/snappy-java.jar

textfile = load 'user/hduser/pig_input/abc.dat' using pigStorage('|');
STORE textfile INTO '/user/hduser/pig_output/' 
    USING org.apache.pig.piggybank.storage.avro.AvroStorage('schema_file','/user/hduser/pig_schema_files/abc.avsc');

运行脚本后出现以下错误:

2015-02-03 09:46:56,369 [main] ERROR org.apache.pig.tools.grunt.Grunt  -                                         ERROR 6000:<file script.pig, line 9, column 0> 
    Output Location Validation Failed for: '/user/hduser/pig_output/
    More info to follow:
    Output schema is null!

【问题讨论】:

有什么建议吗?? 您是否遇到任何错误?能贴一下abc.avsc文件的schema格式吗? @SivasakthiJayaraman .. 我已经更新了这个问题。请看一看。 如果您的文件在 HDFS 中,您是否尝试过此选项? “-f hdfs:///yourdirectory/abc.avsc”)。你能看看链接中的“选项”部分吗? pig.apache.org/docs/r0.13.0/func.html#AvroStorage. 【参考方案1】:

除了 CSV 文件,我们还必须读取字段名称,以便在写入 avro 时,它会自动映射字段名称。

textfile = load 'user/hduser/pig_input/abc.dat' using pigStorage('|') as (ID, TRANS_O,CARD_O,SEQ_O, DATE_O );
STORE textfile INTO '/user/hduser/pig_output/' USING org.apache.pig.piggybank.storage.avro.AvroStorage();

【讨论】:

感谢@Ramakrishna 的回复。但是我相信该脚本只会将文本文件中的记录与指定的列字段进行映射。输出文件将只有具有相应记录的字段名称,但没有包含其中的架构,因为我们在加载记录时不提供任何架构。

以上是关于使用 Pig 脚本将文本文件转换为 avro的主要内容,如果未能解决你的问题,请参考以下文章

在 PIg 脚本中对 Avro 文件使用 UDF

使用 Java 将 Json 对象转换为 Parquet 格式而不转换为 AVRO(不使用 Spark、Hive、Pig、Impala)

无法通过在 Azure HDInsight 中运行的 piggybank.jar 使用 PIG 读取 Avro 文件

如何使用 PIG 将 Avro 格式存储在 HDFS 中?

使用 PIG 查询 Avro 数据时出错,Utf8 无法转换为 java.lang.String

猪:无法将 java.lang.String 转换为 org.apache.avro.util.Utf8 与 STORE 中的 AvroStorage