/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.aliyun.odps.lot.test; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.aliyun.odps.Odps; import com.aliyun.odps.OdpsException; import com.aliyun.odps.OdpsType; import com.aliyun.odps.account.Account; import com.aliyun.odps.account.AliyunAccount; import com.aliyun.odps.lot.Task; import com.aliyun.odps.lot.common.AggregationFunction; import com.aliyun.odps.lot.common.Constant; import com.aliyun.odps.lot.common.IllegalOperationException; import com.aliyun.odps.lot.common.Language; import com.aliyun.odps.lot.common.PartitionSpecification; import com.aliyun.odps.lot.common.Reference; import com.aliyun.odps.lot.common.ReferencedURI; import com.aliyun.odps.lot.common.Resource; import com.aliyun.odps.lot.common.ScalarExpression; import com.aliyun.odps.lot.common.ScalarFunction; import com.aliyun.odps.lot.common.Schema; import com.aliyun.odps.lot.operators.Aggregate; import com.aliyun.odps.lot.operators.Filter; import com.aliyun.odps.lot.operators.Join; import com.aliyun.odps.lot.operators.Join.ExecutionHint; import com.aliyun.odps.lot.operators.Join.Type; import com.aliyun.odps.lot.operators.LanguageSource; import com.aliyun.odps.lot.operators.Select; import com.aliyun.odps.lot.operators.Select.Expression; import com.aliyun.odps.lot.operators.TableScan; import com.aliyun.odps.lot.operators.TableSink; public class Test { public static void main(String[] args) throws IllegalOperationException, OdpsException { if (args.length != 1) { /* /usr/ali/bin/java $trunk/sdk/java/releases/odps-sdk-core/odps-sdk-core-0.14.0-SNAPSHOT.jar:$trunk/odps_planner/relational/java/build/dist/odps_planner_protocol.jar:$trunk/sdk/java/odps-sdk/odps-sdk-lot/target/classes/ com.aliyun.odps.lot.test.Test /tmp/aabb */ System.out.println("Usage: java -classpath xxxx com.aliyun.odps.lot.test.Test output_file"); System.exit(-1); } String accessId = "your access id"; String accessKey = "your access key"; Account account = new AliyunAccount(accessId, accessKey); Odps odps = new Odps(account); String name = "yongfeng.chai"; String project = "default_prj"; Task task = new Task(odps, name); task.addHint("DefaultProject", project); // TableScan_1 TableScan ts_1 = new TableScan(project, "table_src_1"); // Filter_2 ds = 'partition_1' List<ScalarExpression> fil_2_params = new ArrayList<ScalarExpression>(); fil_2_params.add(new Reference("ds", ts_1)); Constant fil_2_const = new Constant(); fil_2_const.setStringValue("src_partition_1"); fil_2_params.add(fil_2_const); // TODO 这里应该有一个builtin func的列表,要不然用户不知道怎么填func name ScalarFunction fil_2_condition = new ScalarFunction(project, "EQUAL", fil_2_params); Filter fil_2 = new Filter(fil_2_condition); ts_1.addChild(fil_2); // LanguageSource_3 ArrayList<Resource> ls_3_res = new ArrayList<Resource>(); ls_3_res.add(new Resource(project, "aabbccdd.jar")); String ls_3_class_name = "main_func"; ArrayList<ReferencedURI> ls_3_uris = new ArrayList<ReferencedURI>(); Schema ls_3_schema = new Schema(); ls_3_schema.addColumn(OdpsType.BIGINT, "key"); ls_3_schema.addColumn(OdpsType.DOUBLE, "val"); ls_3_schema.addColumn(OdpsType.STRING, "ds"); int ls_3_ins_count = 5; HashMap<String, String> ls_3_props = new HashMap<String, String>(); LanguageSource ls_3 = new LanguageSource(Language.Java, ls_3_res, ls_3_class_name, ls_3_uris, ls_3_schema, ls_3_ins_count, ls_3_props); // Filter_4 ds = 'partition_2' List<ScalarExpression> fil_4_params_1 = new ArrayList<ScalarExpression>(); fil_4_params_1.add(new Reference("ds", ls_3)); Constant fil_4_const_1 = new Constant(); fil_4_const_1.setStringValue("src_partition_2"); fil_4_params_1.add(fil_4_const_1); ScalarFunction fil_4_expr_1 = new ScalarFunction(project, "EQUAL", fil_4_params_1); List<ScalarExpression> fil_4_params_2 = new ArrayList<ScalarExpression>(); fil_4_params_2.add(new Reference("ds", ls_3)); Constant fil_4_const_2 = new Constant(); fil_4_const_2.setStringValue("src_partition_3"); fil_4_params_2.add(fil_4_const_2); ScalarFunction fil_4_expr_2 = new ScalarFunction(project, "EQUAL", fil_4_params_2); List<ScalarExpression> fil_4_params_3 = new ArrayList<ScalarExpression>(); fil_4_params_3.add(fil_4_expr_1); fil_4_params_3.add(fil_4_expr_2); ScalarFunction fil_4_condition = new ScalarFunction(project, "OR", fil_4_params_3); Filter fil_4 = new Filter(fil_4_condition); ls_3.addChild(fil_4); // Join_5 table_src_1.key = table_src_2.key List<ScalarExpression> join_5_params = new ArrayList<ScalarExpression>(); join_5_params.add(new Reference("key", ts_1)); join_5_params.add(new Reference("key", ls_3)); ScalarFunction join_5_condition = new ScalarFunction(project, "EQUAL", join_5_params); Join join_5 = new Join(fil_2, fil_4, Type.Inner, join_5_condition); join_5.setExecutionHint(ExecutionHint.FullHashJoin); List<String> smallParents = new ArrayList<String>(); smallParents.add(fil_2.getId()); join_5.setSmallParents(smallParents); fil_2.addChild(join_5); fil_4.addChild(join_5); // Filter_6 table_src_2.key > 0 List<ScalarExpression> fil_6_params = new ArrayList<ScalarExpression>(); fil_6_params.add(new Reference("key", ls_3)); Constant fil_6_const = new Constant(); fil_6_const.setIntValue(0); fil_6_params.add(fil_6_const); ScalarFunction fil_6_condition = new ScalarFunction(project, "GT", fil_6_params); Filter fil_6 = new Filter(fil_6_condition); join_5.addChild(fil_6); // Aggregate_7 count(distinct key) List<ScalarExpression> aggr_7_params = new ArrayList<ScalarExpression>(); aggr_7_params.add(new Reference("key", ls_3)); AggregationFunction aggrFunc = new AggregationFunction(project, "COUNT", true, aggr_7_params); Map<String, AggregationFunction> aggrFuncMap = new HashMap<String, AggregationFunction>(); aggrFuncMap.put("cdk", aggrFunc); List<Reference> gbyCols = new ArrayList<Reference>(); gbyCols.add(new Reference("key", ls_3)); Aggregate aggr_7 = new Aggregate(gbyCols, aggrFuncMap); fil_6.addChild(aggr_7); // Select_8 select cdk List<Expression> exprList = new ArrayList<Expression>(); Expression expr = new Expression("sel_cdk", new Reference("cdk", aggr_7)); exprList.add(expr); Select sel_8 = new Select(exprList); aggr_7.addChild(sel_8); // TableWrite_9 Map<String, Constant> definition = new HashMap<String, Constant>(); Constant tw_9_const_1 = new Constant(); tw_9_const_1.setStringValue("dest_partition_4"); definition.put("pt", tw_9_const_1); Constant tw_9_const_2 = new Constant(); tw_9_const_2.setStringValue("20141030"); definition.put("ds", tw_9_const_2); PartitionSpecification part = new PartitionSpecification(definition); TableSink tw_9 = new TableSink(project, "table_dest_1", true, part); sel_8.addChild(tw_9); task.addRootOperator(ts_1); task.addRootOperator(ls_3); ByteArrayInputStream stream = task.getTaskInputStream(); try { File file = new File(args[0]); if (file.isFile() && file.exists()) { file.delete(); } BufferedOutputStream bufOutputStream = new BufferedOutputStream(new FileOutputStream(file)); byte[] tmp = new byte[1]; while (stream.read(tmp) != -1) { bufOutputStream.write(tmp); } stream.close(); bufOutputStream.flush(); bufOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } }