Hi,

> I opened a JIRA (FLINK-2442) and submitted a PR (#963) for the "Wrong field
> type" problem.

Thanks for the fix!

> Is the other problem is addressed in FLINK-2437?

Unfortunately no. FLINK-2437 is a minor thing compared to the other
problem. I opened a Jira for it (FLINK-2447).

Best,
Gabor





2015-07-31 0:29 GMT+02:00 Fabian Hueske <fhue...@gmail.com>:
> Hi,
>
> I opened a JIRA (FLINK-2442) and submitted a PR (#963) for the "Wrong field
> type" problem.
> Is the other problem is addressed in FLINK-2437?
>
> Cheers, Fabian
>
> 2015-07-30 16:29 GMT+02:00 Gábor Gévay <gga...@gmail.com>:
>>
>> Thanks for the response.
>> As a temporary workaround, I tried to change these problematic lines:
>>
>> } else {
>>    Preconditions.checkArgument(fieldType instanceof AtomicType, "Wrong
>> field type: " + fieldType.toString());
>>    keyFields.add(new FlatFieldDescriptor(keyId, fieldType));
>> }
>>
>> into this:
>>
>> } else if (fieldType instanceof AtomicType) {
>>    keyFields.add(new FlatFieldDescriptor(keyId, fieldType));
>> } else {
>>    Preconditions.checkArgument(fieldType instanceof PojoTypeInfo,
>> "Wrong field type: " + fieldType.toString());
>>    ((PojoTypeInfo)fieldType).getFlatFields("*", 0, keyFields);
>> }
>>
>>
>> But then I ran into another problem: The TypeExtractor creates the
>> TupleTypeInfoBase for the Edge type of my graph with the following
>> types:
>>
>> 0 = {PojoTypeInfo@1067} "PojoType<malom.GameState, fields = [board:
>> Long, sid: PojoType<malom.SectorId, fields = [b: Byte, bf: Byte, w:
>> Byte, wf: Byte]>]>"
>> 1 = {GenericTypeInfo@1068} "GenericType<malom.GameState>"
>> 2 = {ValueTypeInfo@1069} "ValueType<NullValue>"
>>
>> The problem here is that the first two types should clearly be the
>> same, as the Edge type looks like this:
>> public class Edge<K, V> extends Tuple3<K, K, V>
>>
>> I did a bit of debugging on this, and the source of the problem seems
>> to be the mechanism in TypeExtractor that would detect recursive types
>> (see the "alreadySeen" field in TypeExtractor), as it mistakes the
>> second appearance of malom.GameState with a recursive field.
>>
>> Specifically the following happens: createTypeInfoWithTypeHierarchy
>> starts to process the Edge type, and in line 433 it calls itself for
>> the first field, which proceeds into the privateGetForClass case which
>> correctly detects that it is a POJO, and correctly returns a
>> PojoTypeInfo; but in the meantime in line 1190, privateGetForClass
>> adds malom.GameState to "alreadySeen". Then the outer
>> createTypeInfoWithTypeHierarchy approaches the second field, goes into
>> privateGetForClass, which mistakenly returns a GenericTypeInfo, as it
>> thinks in line 1186, that a recursive type is being processed.
>>
>> Should I open a Jira for this?
>>
>> A possible solution would be to change the alreadySeen field into a
>> parameter of all the various type extraction methods, and make it
>> contain only those types that are ancestors in the nesting hierarchy.
>>
>> Best regards,
>> Gabor
>>
>> 2015-07-30 14:32 GMT+02:00 Fabian Hueske <fhue...@gmail.com>:
>> > Thanks for reporting this issue.
>> > The "Wrong field type" error looks like a bug to me.
>> > This happens, because PojoType is neither a TupleType nor an AtomicType.
>> > To
>> > me it looks like the TupleTypeInfoBase condition should be generalized
>> > to
>> > CompositeType.
>> >
>> > I will look into this.
>> >
>> > Cheers, Fabian
>> >
>> > 2015-07-30 14:18 GMT+02:00 Gábor Gévay <gga...@gmail.com>:
>> >>
>> >> Hello,
>> >>
>> >> I am having some trouble building a graph where the vertex ID type is
>> >> a POJO. Specifically, it would be a class that has two fields: a long
>> >> field, and a field which is of another class that has four byte
>> >> fields. (Both classes implement the Comparable interface, as the Gelly
>> >> guide specifies.) If the outer class has a default constructor, then
>> >> it is recognized as a POJO, but I get the following exception:
>> >>
>> >> Exception in thread "main" java.lang.IllegalArgumentException: Wrong
>> >> field type: PojoType<malom.GameState, fields = [board: Long, sid:
>> >> PojoType<malom.SectorId, fields = [b: Byte, bf: Byte, w: Byte, wf:
>> >> Byte]>]>
>> >>     at
>> >>
>> >> com.google.common.base.Preconditions.checkArgument(Preconditions.java:122)
>> >>     at
>> >>
>> >> org.apache.flink.api.java.operators.Keys$ExpressionKeys.<init>(Keys.java:241)
>> >>     at
>> >>
>> >> org.apache.flink.api.java.operators.Keys$ExpressionKeys.<init>(Keys.java:203)
>> >>     at
>> >>
>> >> org.apache.flink.api.java.operators.CoGroupOperator$CoGroupOperatorSets.where(CoGroupOperator.java:458)
>> >>     at org.apache.flink.graph.Graph.inDegrees(Graph.java:701)
>> >>     at
>> >>
>> >> org.apache.flink.graph.spargel.VertexCentricIteration.createResultVerticesWithDegrees(VertexCentricIteration.java:610)
>> >>     at
>> >>
>> >> org.apache.flink.graph.spargel.VertexCentricIteration.createResult(VertexCentricIteration.java:180)
>> >>     at
>> >> org.apache.flink.api.java.DataSet.runOperation(DataSet.java:1044)
>> >>     at
>> >> org.apache.flink.graph.Graph.runVertexCentricIteration(Graph.java:1312)
>> >>     at malom.Retrograde.run(Retrograde.java:64)
>> >>     at malom.Solver.main(Solver.java:32)
>> >>     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> >>     at
>> >>
>> >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>> >>     at
>> >>
>> >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>> >>     at java.lang.reflect.Method.invoke(Method.java:497)
>> >>     at
>> >> com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
>> >>
>> >> Note, that originally the exception just said "Wrong field type", from
>> >> which I had no idea what type is it referring to, so I modified line
>> >> 241 of Keys.java to include the type in the msg like this:
>> >> Preconditions.checkArgument(fieldType instanceof AtomicType, "Wrong
>> >> field type: " + fieldType.toString());
>> >>
>> >> On the other hand, if I comment out the default constructor of the
>> >> outer class, then it is not a POJO, but only a GenericTypeInfo is
>> >> created from it, which implements AtomicType, so the previous
>> >> exception does not appear. Does this mean that the Vertex IDs cannot
>> >> be POJOs? I am not sure if this is the intended behaviour. After all,
>> >> if we have a POJO, that should always be better then if we have a
>> >> generic type, right?
>> >>
>> >> (I am just guessing here, but maybe CompositeType could also be
>> >> regarded as an AtomicType: the only method declared by the AtomicType
>> >> interface is createComparator, which is also defined in CompositeType
>> >> (of which PojoTypeInfo is a subclass), but with different parameters,
>> >> but maybe CompositeType could implement AtomicType by delegating the
>> >> createComparator call with all of the fields specified?)
>> >>
>> >> I encountered another problem, which is may or may not be related to
>> >> the above: without the default constructor (the GenericTypeInfo case),
>> >> the VertexCentricIteration "eats" my graph, that is, the result graph
>> >> has zero vertices. I traced this problem to the first join in
>> >> VertexCentricIteration.createResultVerticesWithDegrees, where the
>> >> "degrees" DataSet is created: both inputs of the join (outDegrees and
>> >> inDegrees) contains the correct data, but the result (degrees) is
>> >> empty. Interestingly, this problem disappears, if I add
>> >> JoinHint.REPARTITION_SORT_MERGE.
>> >>
>> >> Best regards,
>> >> Gabor
>> >
>> >
>
>

Reply via email to