温馨提示:文本由机器自动转译,部分词句存在误差,以视频为准
00:00
好,介绍完映射之后呢,再往下要给大家讲一个映射的时候啊,它是有一个bug的啊,当然这也不能完全说是一个bug啊,大家在底层存储这个数字的时候呢,都会有一点点不一样啊,I存储的时候,底层存储的是补码啊,而peni呢,是在补码的基础上又将符号为反转了啊,你也不要去问他为啥反转,咱也不知道啊,反正它就反转了,所以呢,你在用Phoenix去映射h base里面已经存在的表的时候,如果H里面有数字类型的字段,会出现解析错误。这是一个非常偏的一个bug,因为我们一般存在h base上面的都不会是数字,能理解吧,都会是什么呀,字符串对不对,它是一个byta数组,你数字也能经过呃一个编码得到一个be数组啊,但我们一般不量存,你要要这存也可以啊,它在解析的时候会有一个小小的bug,咱们一起来看一下,在I base里面,我们把这个表呢叫test number给创建出来,同时呢,往里面写入这条数据啊,我们一条一条来,首先创建一个。
01:02
Number的一个表格。诶,我看一下啊,啊,他已经创建完成了啊,创建完成之后呢,我们来执行这么一个命令,把一个数字给它写进去,注意啊,你要往里面写1000的话,你直接写1000是不行的,直接写1000它是会被当做一个字符串的,你需要用by west转化,转化的时候它会被当做long,也就是big in。它俩是一个意思对吧,好找完一个被呢往里面写,你去执行它就写进去了,写完之后你来扫描这个表啊,叫test。你来扫描这个表,你会看到它确实是一个啊,经过编码的一个数字对吧?啊,经过编码一个数字啊,这应该是一个16进制的一个表示方法啊好,它经过编码之后呢,咱们对应的来分这边呢,来进行一个映射关系啊,就是表格映射或者视图映射都可以啊,我们这边呢,创建一个视图映射,因为只是看一下嘛,啊我们CTRLC这个命令呢,刚才已经讲过了,就不做过多的介绍了,这是主键对不对,这是in for.number就对那个值。
02:08
格呃,它的数据类型呢,也是被给的,看看出来啊,是能够对上号的,对上号之后创建。创建之后,我们来读一下这个表格。好,读一下这个表格啊,Select。星from双引号。啊,这个它折了对吧,你还可以给他扇回来啊,这个七写的是真的好啊。好,你读一下啊,你读完之后呢,你会发现它变成了一个非常大的一个负数啊,非常大的一个负数,这个大的负数呢,大概是呃,Long的那个最大值,然后是减去100哈,大概是减去1000啊大概这么一个值啊,具体多少呢,咱们也不看了,总之它符号位错了对吧?符号位错了啊,那这个bug呢,有没有解决办法呢?有两种啊,能够解决的方法呢,有两种啊,一种方法呢是你使用无符号的类型,如果你在A和peni里面存储的这个数据呢,统一都是用正数的,你不会用到负数,那你可以用这种方案,直接使用无符号的类型就可以解决了啊,你把之前的这个view呢给它试图给它删除掉。
03:14
删除掉之后呢,我们来重新创建一个视图啊,这个视图呢,就一个地方不一样啊,就是这个它的一个类型啊,改成无符号的一个浪啊好呃,改完之后呢,我们再来读这个数据啊,再来读呢,它就变成了1000,看到没有,它就能够准确的识别这个数表,主要就在于它的符号有点不太一样啊,那这种方法呢,是没有办法解决负数的一个问题了,如果你想要考虑负数的话,那没有办法了,只能用Phoenix的自定义函数了,当然这个地方它这个bug比较偏啊,比较偏是实上呢,我们也不太会遇到这个bug,你存1000存在h base里面的时候,我们多数情况下会以字符二的形式给它存进去,对吧?读的时候呢,你再进行转化就可以了啊,你一定要用这个呃,Long啊,或者是big in去存的话呢,它才会出现这么一个问题啊,咱们只是给大家介绍一下这么一个bug。
我来说两句