You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user-zh@flink.apache.org by 史 正超 <sh...@outlook.com> on 2020/10/14 02:19:27 UTC

回复: flink-SQL1.11版本对map类型中value的空指针异常

从你的异常来看,你用的format是 avro, 我看了下源码,他对varchar类型的covert和json不一样,avro的代码是这样的:

case CHAR:
case VARCHAR:
   return avroObject -> StringData.fromString(avroObject.toString());

所以,你的map类型的value值为null,会报空指针异常的。
________________________________
发件人: 奔跑的小飞袁 <s_...@126.com>
发送时间: 2020年10月14日 1:46
收件人: user-zh@flink.apache.org <us...@flink.apache.org>
主题: Re: flink-SQL1.11版本对map类型中value的空指针异常

other_para MAP<VARCHAR,VARCHAR>



--
Sent from: http://apache-flink.147419.n8.nabble.com/

Re: flink-SQL1.11版本对map类型中value的空指针异常

Posted by 奔跑的小飞袁 <s_...@126.com>.
好的,谢谢



--
Sent from: http://apache-flink.147419.n8.nabble.com/

Re: 回复: flink-SQL1.11版本对map类型中value的空指针异常

Posted by 奔跑的小飞袁 <s_...@126.com>.
好的,我尝试一下



--
Sent from: http://apache-flink.147419.n8.nabble.com/

Re: 回复: 回复: flink-SQL1.11版本对map类型中value的空指针异常

Posted by 奔跑的小飞袁 <s_...@126.com>.
我之前对源码进行了修复,测试的时候没有恢复之前的源码状态,后来发现Map<STRING,STRING NULL>这种方式是不可以的



--
Sent from: http://apache-flink.147419.n8.nabble.com/

回复: 回复: flink-SQL1.11版本对map类型中value的空指针异常

Posted by 史 正超 <sh...@outlook.com>.
Benchao Li的那个方法是对的,avro的一个bug:

private static AvroToRowDataConverter createMapConverter(LogicalType type) {
   final AvroToRowDataConverter keyConverter = createConverter(DataTypes.STRING().getLogicalType());
   final AvroToRowDataConverter valueConverter = createConverter(extractValueTypeToAvroMap(type));

   return avroObject -> {
      final Map<?, ?> map = (Map<?, ?>) avroObject;
      Map<Object, Object> result = new HashMap<>();
      for (Map.Entry<?, ?> entry : map.entrySet()) {
         Object key = keyConverter.convert(entry.getKey());
         Object value = valueConverter.convert(entry.getValue());
         result.put(key, value);
      }
      return new GenericMapData(result);
   };
}

 应该是 createNullableConverter

final AvroToRowDataConverter valueConverter = createNullableConverter(extractValueTypeToAvroMap(type));

________________________________
发件人: 史 正超 <sh...@outlook.com>
发送时间: 2020年10月14日 5:22
收件人: user-zh@flink.apache.org <us...@flink.apache.org>
主题: 回复: 回复: flink-SQL1.11版本对map类型中value的空指针异常

确定吗?我这边测试还是有问题,这应该是avro 的一个bug。
________________________________
发件人: 奔跑的小飞袁 <s_...@126.com>
发送时间: 2020年10月14日 3:29
收件人: user-zh@flink.apache.org <us...@flink.apache.org>
主题: Re: 回复: flink-SQL1.11版本对map类型中value的空指针异常

我尝试使用MAP<STRING, STRING NULL>来定义我的类型,问题已经解决,谢谢



--
Sent from: http://apache-flink.147419.n8.nabble.com/

回复: 回复: flink-SQL1.11版本对map类型中value的空指针异常

Posted by 史 正超 <sh...@outlook.com>.
确定吗?我这边测试还是有问题,这应该是avro 的一个bug。
________________________________
发件人: 奔跑的小飞袁 <s_...@126.com>
发送时间: 2020年10月14日 3:29
收件人: user-zh@flink.apache.org <us...@flink.apache.org>
主题: Re: 回复: flink-SQL1.11版本对map类型中value的空指针异常

我尝试使用MAP<STRING, STRING NULL>来定义我的类型,问题已经解决,谢谢



--
Sent from: http://apache-flink.147419.n8.nabble.com/

Re: 回复: flink-SQL1.11版本对map类型中value的空指针异常

Posted by 奔跑的小飞袁 <s_...@126.com>.
我尝试使用MAP<STRING, STRING NULL>来定义我的类型,问题已经解决,谢谢



--
Sent from: http://apache-flink.147419.n8.nabble.com/

回复: flink-SQL1.11版本对map类型中value的空指针异常

Posted by 史 正超 <sh...@outlook.com>.
所以我的建议是用avro的规范,你可以这样定义你的MAP类型:
MAP<STRING, STRING NULL>
________________________________
发件人: 史 正超 <sh...@outlook.com>
发送时间: 2020年10月14日 2:45
收件人: user-zh <us...@flink.apache.org>
主题: 回复: flink-SQL1.11版本对map类型中value的空指针异常


但是 方法上有这样的一个注释:Creates a runtime converter which assuming input object is not null.
代码这样写的前提是,不允许对象的值为null的。
________________________________
发件人: Benchao Li <li...@apache.org>
发送时间: 2020年10月14日 2:34
收件人: user-zh <us...@flink.apache.org>
主题: Re: flink-SQL1.11版本对map类型中value的空指针异常

嗯,这应该是一个实现的bug,可以提个issue修复一下~

史 正超 <sh...@outlook.com> 于2020年10月14日周三 上午10:19写道:

> 从你的异常来看,你用的format是 avro, 我看了下源码,他对varchar类型的covert和json不一样,avro的代码是这样的:
>
> case CHAR:
> case VARCHAR:
>    return avroObject -> StringData.fromString(avroObject.toString());
>
> 所以,你的map类型的value值为null,会报空指针异常的。
> ________________________________
> 发件人: 奔跑的小飞袁 <s_...@126.com>
> 发送时间: 2020年10月14日 1:46
> 收件人: user-zh@flink.apache.org <us...@flink.apache.org>
> 主题: Re: flink-SQL1.11版本对map类型中value的空指针异常
>
> other_para MAP<VARCHAR,VARCHAR>
>
>
>
> --
> Sent from: http://apache-flink.147419.n8.nabble.com/
>


--

Best,
Benchao Li

Re: flink-SQL1.11版本对map类型中value的空指针异常

Posted by Benchao Li <li...@apache.org>.
是的,所以应该用createNullableConverter,而不是createConverter

史 正超 <sh...@outlook.com> 于2020年10月14日周三 上午10:45写道:

>
> 但是 方法上有这样的一个注释:Creates a runtime converter which assuming input object is
> not null.
> 代码这样写的前提是,不允许对象的值为null的。
> ________________________________
> 发件人: Benchao Li <li...@apache.org>
> 发送时间: 2020年10月14日 2:34
> 收件人: user-zh <us...@flink.apache.org>
> 主题: Re: flink-SQL1.11版本对map类型中value的空指针异常
>
> 嗯,这应该是一个实现的bug,可以提个issue修复一下~
>
> 史 正超 <sh...@outlook.com> 于2020年10月14日周三 上午10:19写道:
>
> > 从你的异常来看,你用的format是 avro, 我看了下源码,他对varchar类型的covert和json不一样,avro的代码是这样的:
> >
> > case CHAR:
> > case VARCHAR:
> >    return avroObject -> StringData.fromString(avroObject.toString());
> >
> > 所以,你的map类型的value值为null,会报空指针异常的。
> > ________________________________
> > 发件人: 奔跑的小飞袁 <s_...@126.com>
> > 发送时间: 2020年10月14日 1:46
> > 收件人: user-zh@flink.apache.org <us...@flink.apache.org>
> > 主题: Re: flink-SQL1.11版本对map类型中value的空指针异常
> >
> > other_para MAP<VARCHAR,VARCHAR>
> >
> >
> >
> > --
> > Sent from: http://apache-flink.147419.n8.nabble.com/
> >
>
>
> --
>
> Best,
> Benchao Li
>


-- 

Best,
Benchao Li

回复: flink-SQL1.11版本对map类型中value的空指针异常

Posted by 史 正超 <sh...@outlook.com>.
但是 方法上有这样的一个注释:Creates a runtime converter which assuming input object is not null.
代码这样写的前提是,不允许对象的值为null的。
________________________________
发件人: Benchao Li <li...@apache.org>
发送时间: 2020年10月14日 2:34
收件人: user-zh <us...@flink.apache.org>
主题: Re: flink-SQL1.11版本对map类型中value的空指针异常

嗯,这应该是一个实现的bug,可以提个issue修复一下~

史 正超 <sh...@outlook.com> 于2020年10月14日周三 上午10:19写道:

> 从你的异常来看,你用的format是 avro, 我看了下源码,他对varchar类型的covert和json不一样,avro的代码是这样的:
>
> case CHAR:
> case VARCHAR:
>    return avroObject -> StringData.fromString(avroObject.toString());
>
> 所以,你的map类型的value值为null,会报空指针异常的。
> ________________________________
> 发件人: 奔跑的小飞袁 <s_...@126.com>
> 发送时间: 2020年10月14日 1:46
> 收件人: user-zh@flink.apache.org <us...@flink.apache.org>
> 主题: Re: flink-SQL1.11版本对map类型中value的空指针异常
>
> other_para MAP<VARCHAR,VARCHAR>
>
>
>
> --
> Sent from: http://apache-flink.147419.n8.nabble.com/
>


--

Best,
Benchao Li

Re: flink-SQL1.11版本对map类型中value的空指针异常

Posted by Benchao Li <li...@apache.org>.
嗯,这应该是一个实现的bug,可以提个issue修复一下~

史 正超 <sh...@outlook.com> 于2020年10月14日周三 上午10:19写道:

> 从你的异常来看,你用的format是 avro, 我看了下源码,他对varchar类型的covert和json不一样,avro的代码是这样的:
>
> case CHAR:
> case VARCHAR:
>    return avroObject -> StringData.fromString(avroObject.toString());
>
> 所以,你的map类型的value值为null,会报空指针异常的。
> ________________________________
> 发件人: 奔跑的小飞袁 <s_...@126.com>
> 发送时间: 2020年10月14日 1:46
> 收件人: user-zh@flink.apache.org <us...@flink.apache.org>
> 主题: Re: flink-SQL1.11版本对map类型中value的空指针异常
>
> other_para MAP<VARCHAR,VARCHAR>
>
>
>
> --
> Sent from: http://apache-flink.147419.n8.nabble.com/
>


-- 

Best,
Benchao Li