Apache Pig UDF和outputSchema定制

时间:2015-12-14 20:59:37

标签: java apache-pig cloudera udf

我试图实现UDF功能来处理各种源/输入文件。输入文件因列数而异。我的目的是拥有通用的UDF功能。每次运行的pig脚本都会处理一种输入文件(由' |'。

分隔的相同数量的记录。

UDF函数应读取由分隔符(|)分隔的所有输入记录,并根据某些条件生成一个包含两个元组的包,例如。 输入(1,2,3,4,5,6)输出 a){(1,3),(2,4,5,6)} 要么 b){(2,3,4),(1,5,6)}

我无法扩展outputSchema方法来处理不同大小的元组的创建。没有办法将额外的参数传递给outputSchema方法。不可能使用定义为EvalFunc类定义一部分的临时变量,因为每次运行都会使其值为空。

任何提示?谢谢

更新:

我使用GRUNT执行以下命令,在" AS"

之后可以看到inputSchema。
<div class="row right_row">
  <div class="left_image"></div>
  <div class="content">
    Lorem ipsum content here. Lorem ipsum content here. Lorem ipsum content here. Lorem ipsum content here. Lorem ipsum content here. Lorem ipsum content here.
  </div>
</div>
<div class="row left_row">
  <div class="content">
    Lorem ipsum content here. Lorem ipsum content here. Lorem ipsum content here. Lorem ipsum content here. Lorem ipsum content here. Lorem ipsum content here.
  </div>
  <div class="right_image"></div>
</div>

UDF代码在这里......

sourceData = foreach sourceData generate com.pig.Data('test.json', *) as (t:(s:(VIN: chararray,Birthdate: chararray), n:(name: chararray,customerId: chararray,Mileage: chararray,Fuel_Consumption: chararray)));

(第233行)System.out.println(&#34; ----------------------&#34; + input.getFields()。尺寸());

错误:

public Schema outputSchema(Schema input) {

UPDATE2:

好的,输入模式是从上一个pig命令传播的......

sourceData = load&#39; test.csv&#39;使用PigStorage(&#39;,&#39;)为(VIN:chararray,Birthdate:chararray,name:chararray,customerId:chararray,Mileage:chararray,Fuel_Consumption:chararray);

sourceData = foreach sourceData generate com.pig.Data&#39; test_data_desc.json&#39;,*)as(t:(s:(VIN:chararray,Birthdate:chararray),n :( name:chararray,customerId :chararray,Mileage:chararray,Fuel_Consumption:chararray)));

哪个没用 - (因为它不可能传播任何其他属性或者不可能在里面创建任何其他更复杂的逻辑 outputSchema方法; - (

1 个答案:

答案 0 :(得分:0)

在outputSchema函数中,您可以访问输入模式,并使用输入模式信息根据输入动态生成输出模式(如果输入以某种方式反映了预期输出)。 例如:

  public Schema outputSchema(Schema input) {
    Schema mySchema = new Schema();
    if (input.getFields().size() == 3) {
      mySchema.add(new Schema.FieldSchema("data1", DataType.DOUBLE));
      mySchema.add(new Schema.FieldSchema("data2", DataType.DOUBLE));
      mySchema.add(new Schema.FieldSchema("data3", DataType.DOUBLE));
    } else {
      mySchema.add(new Schema.FieldSchema("data", DataType.CHARARRAY));
    }
    return mySchema;
  }

我希望这会有所帮助。