I’ve merged a patch [1] for this issue. Now we can use Option as a key.

[1]: 
https://git-wip-us.apache.org/repos/asf?p=flink.git;a=commit;h=c60326f85faaa38bcc359d555cd2d2818ef2e4e7

Regards,
Chiwan Park

> On Apr 5, 2016, at 2:08 PM, Chiwan Park <chiwanp...@apache.org> wrote:
> 
> I just found that Timur created a JIRA issue for this (FLINK-3698).
> 
> Regards,
> Chiwan Park
> 
>> On Mar 31, 2016, at 7:27 PM, Till Rohrmann <trohrm...@apache.org> wrote:
>> 
>> Actually I think that it’s not correct that the OptionType cannot be used as 
>> a key type. In fact it is similar to a composite type and should be usable 
>> as a key iff it’s element can be used as a key. Then we only have to provide 
>> an OptionTypeComparator which will compare the elements if they are set. If 
>> not, then the None element will be smaller, for example.
>> 
>> @Timur, if you want, then you can file a JIRA issue to add that.
>> 
>> Cheers,
>> Till
>> 
>> 
>> On Wed, Mar 30, 2016 at 7:17 PM, Timur Fayruzov <timur.fairu...@gmail.com> 
>> wrote:
>> Ok, I can't make Option comparable, so the only way that I see is to 
>> translate a key to a Comparable data structure and use it (as it was alluded 
>> to in your example above). Thank you for clarification!
>> 
>> Thanks,
>> Timur
>> 
>> On Wed, Mar 30, 2016 at 9:22 AM, Chiwan Park <chiwanp...@apache.org> wrote:
>> Hi Timur,
>> 
>> Sorry for confusing. I meant KeySelector.
>> 
>> `GenericType<T>` could be used as a key type if the `T` implements 
>> `Comparable`. For example, `GenericType<Integer>` could be used as a key 
>> type but `GenericType<scala.Tuple2>` could not.
>> 
>> About my example in previous mail, the type of key is `Int` because the 
>> return type of KeySelector is `Int`. `TypeInformation<Int>` is not generic 
>> type.
>> 
>> Regards,
>> Chiwan Park
>> 
>>> On Mar 31, 2016, at 1:09 AM, Timur Fayruzov <timur.fairu...@gmail.com> 
>>> wrote:
>>> 
>>> Thank you for your answers, Chiwan! That would mean that a generic type 
>>> can't be used as a key in general? This is a non-obvious limitation of 
>>> Flink DSL that I didn't see in documentation.
>>> 
>>> Could you please elaborate what you mean by KeyExtractor? I see that inside 
>>> `where` operator an instance of KeySelector is initialized, but I don't see 
>>> how can I pass a custom KeySelector in.
>>> 
>>> Thanks,
>>> Timur
>>> 
>>> On Wed, Mar 30, 2016 at 12:53 AM, Chiwan Park <chiwanp...@apache.org> wrote:
>>> Hi Timur,
>>> 
>>> Because Option[T] is not comparable type generally (if T is a POJO type), 
>>> you cannot use Option[T] as a key type. I think you have to implement 
>>> KeyExtractor to compare objects including Option[T]s.
>>> 
>>> ```
>>> case class MyKey(k1: Option[String], k2: Option[String])
>>> 
>>> val data1 = env.fromElements(MyKey(Some("a"), None), MyKey(Some("a"), 
>>> Some("c")))
>>> val data2 = env.fromElements(MyKey(Some("b"), None), MyKey(Some("a"), 
>>> Some("c")))
>>> 
>>> data1.join(data2)
>>>  .where(_.hashCode())
>>>  .equalTo(_.hashCode()).apply {
>>>    (left: MyKey, right: MyKey) => (left, right)
>>>  }.print()
>>> ```
>>> 
>>> Note that the approach in example (using hashCode()) cannot be applied to 
>>> sort task.
>>> 
>>> Regards,
>>> Chiwan Park
>>> 
>>>> On Mar 30, 2016, at 2:37 AM, Timur Fayruzov <timur.fairu...@gmail.com> 
>>>> wrote:
>>>> 
>>>> There is some more detail to this question that I missed initially. It 
>>>> turns out that my key is a case class of a form MyKey(k1: Option[String], 
>>>> k2: Option[String]). Keys.SelectorFunctionKeys is performing a recursive 
>>>> check whether every element of the MyKey class can be a key and fails when 
>>>> encountering an Option.
>>>> 
>>>> Is it possible to work around this situation without giving up Options? 
>>>> Inability to use Options in Domain objects could be really frustrating.
>>>> 
>>>> Thanks,
>>>> Timur
>>>> 
>>>> On Tue, Mar 29, 2016 at 10:19 AM, Timur Fayruzov 
>>>> <timur.fairu...@gmail.com> wrote:
>>>> Hello,
>>>> 
>>>> I'm evaluating Flink and one thing I noticed is Option[A] can't be used as 
>>>> a key for coGroup (looking specifically here: 
>>>> https://github.com/apache/flink/blob/master/flink-scala/src/main/scala/org/apache/flink/api/scala/typeutils/OptionTypeInfo.scala#L39).
>>>>  I'm not clear about the reason of this and appreciate if someone can 
>>>> explain.
>>>> 
>>>> Thanks,
>>>> Timur
>>>> 
>>> 
>>> 
>> 
>> 
>> 
> 

Reply via email to