/*
* 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.github.projectflink.testPlan;
import org.apache.commons.lang.StringUtils;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.io.DiscardingOutputFormat;
import org.apache.flink.api.java.operators.MapOperator;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.core.memory.DataInputView;
import org.apache.flink.core.memory.DataOutputView;
import org.apache.flink.types.Value;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.hadoop.fs.shell.Count;
import scala.reflect.internal.Trees;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
@SuppressWarnings("serial")
public class KryoTest {
// *************************************************************************
// PROGRAM
// *************************************************************************
public static void main(String[] args) throws Exception {
// set up the execution environment
final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
// get input data
DataSet<String> text = env.readTextFile(args[0]);
boolean kryoMode = false;
if(args[1].equals("kryo")) {
kryoMode = true;
DataSet<KryoType> ds = text.map(new MapFunction<String, KryoType>() {
@Override
public KryoType map(String s) throws Exception {
KryoType kt = new KryoType();
kt.elements = new ArrayList<Object>();
String[] splits = s.split(" ");
for (String split : splits) {
if(split == null || split.length() == 0) continue;
if (StringUtils.isNumeric(split)) {
try {
kt.elements.add(Integer.valueOf(split));
} catch (Throwable t) {
kt.elements.add(Integer.valueOf(0));
}
} else {
kt.elements.add(split);
}
}
return kt;
}
});
DataSet<Tuple2<Object, Integer>> ds1 = ds.rebalance().map(new MapFunction<KryoType, Tuple2<Object, Integer>>() {
@Override
public Tuple2<Object, Integer> map(KryoType valueType) throws Exception {
return new Tuple2<Object, Integer>(valueType.elements.iterator().next(), valueType.elements.size());
}
});
ds1.output(new DiscardingOutputFormat<Tuple2<Object, Integer>>());
} else {
DataSet<ValueType> ds = text.map(new MapFunction<String, ValueType>() {
@Override
public ValueType map(String s) throws Exception {
ValueType vt = new ValueType();
vt.elements = new ArrayList<Object>();
String[] splits = s.split(" ");
for (String split : splits) {
if(split == null || split.length() == 0) continue;
if (StringUtils.isNumeric(split)) {
try {
vt.elements.add(Integer.valueOf(split));
} catch (Throwable t) {
vt.elements.add(Integer.valueOf(0));
}
} else {
vt.elements.add(split);
}
}
return vt;
}
});
DataSet<Tuple2<Object, Integer>> ds1 = ds.rebalance().map(new MapFunction<ValueType, Tuple2<Object, Integer>>() {
@Override
public Tuple2<Object, Integer> map(ValueType valueType) throws Exception {
return new Tuple2<Object, Integer>(valueType.elements.iterator().next(), valueType.elements.size());
}
});
ds1.output(new DiscardingOutputFormat<Tuple2<Object, Integer>>());
}
// execute program
env.execute("KryoTest kryoMode=" + kryoMode);
}
public static class Countable {
public Collection<Object> elements;
public int getCollectionSize() {
return elements.size();
}
}
public static class KryoType extends Countable {
@Override
public String toString() {
return "KryoType{" +
"elements=" + elements +
'}';
}
}
public static class ValueType extends Countable implements Value {
public ValueType() {
elements = new ArrayList<Object>();
}
@Override
public void write(DataOutputView dataOutputView) throws IOException {
dataOutputView.writeInt(elements.size());
for(Object e: elements) {
if(e instanceof Integer) {
dataOutputView.writeInt(0);
dataOutputView.writeInt((Integer) e);
} else {
dataOutputView.writeInt(1);
dataOutputView.writeUTF((String) e);
}
}
}
@Override
public void read(DataInputView dataInputView) throws IOException {
elements.clear();
int size = dataInputView.readInt();
for(int i = 0; i < size; i++) {
int type = dataInputView.readInt();
if (type == 0) {
elements.add(dataInputView.readInt());
} else {
elements.add(dataInputView.readUTF());
}
}
}
@Override
public String toString() {
return "ValueType{" +
"elements=" + elements +
'}';
}
}
}