Hi, Peihui

我理解你的需求是json中有一些复杂的字段,你不想解析,希望后续用UDTF在来解析,这个应该做不到的,现在的json format 的解析的底层实现
就是按照json的标准格式解析(jackson)的,没法将一个 
jsonObject解析成一个String。另外如果你jsonObject中的内容格式不确定,也不适合在Schema中声明,
因为SQL 是预编译后执行的,不能做到schema里是三个field,执行时又能解析四个field。

一种做法是定义复杂的jsonObject对应的ROW<a INT, b STRING, …> 
将全部可能的字段包含进去,每条记录没有的字段解析出来的会是null,fail-on-missing-field 默认关闭的,
另外一种推荐你把复杂的字段在上游就转义成一个String放到json的一个field中,这样Flink解析出来就是一个String, 
然后query里用UDTF处理。


祝好
Leonard Xu




> 在 2020年7月10日,10:16,Peihui He <[email protected]> 写道:
> 
> Hello,
> 
>       实际上,我也并不太关心这个字段的内容,能按string 保存下来就好了。
> 
> Best wishes.
> 
> Peihui He <[email protected]> 于2020年7月10日周五 上午10:12写道:
> 
>> Hello,
>> 
>>       明白您的意思。但是当一个字段下的json 字段不确定,类似一个黑盒子一样的化,就不好定义了。
>> 
>> 
>> Best wishes.
>> 
>> LakeShen <[email protected]> 于2020年7月10日周五 上午10:03写道:
>> 
>>> Hi Peihui,
>>> 
>>> 如果消费的 Kafka json 中,json 比较复杂的话,比如存在嵌套,就像下面的格式:
>>> 
>>> {
>>>    "a":"b",
>>>    "c":{
>>>        "d":"e",
>>>        "g":"f"
>>>    }
>>> },
>>> 
>>> 那么在 kafka table source 可以使用 row 来定义:
>>> 
>>> create table xxx (
>>> a varchar,
>>> c row<d varchar , g varchar>
>>> )
>>> 
>>> 如果 还存在嵌套,可以继续再使用 Row 来定义。
>>> 
>>> Best,
>>> LakeShen
>>> 
>>> Peihui He <[email protected]> 于2020年7月10日周五 上午9:12写道:
>>> 
>>>> Hello:
>>>> 
>>>>        在用flink sql从kafka消费数据时,有些json比较复杂,想直接定义为object,在后续通过udf转为string。
>>>> 
>>>>         有什么办法不?我在建表的时候有提示过json_object 类型,但是用了又提示其他类型。
>>>> 
>>>> 
>>>> Best wishes.
>>>> 
>>> 
>> 

回复