由于精度损失,无法将数据插入分区表
Posted
技术标签:
【中文标题】由于精度损失,无法将数据插入分区表【英文标题】:Unable to insert data into partitioned table due to precision loss 【发布时间】:2018-07-19 02:15:56 【问题描述】:我在两列上创建了一个外部表分区。这两列是存储为 SEQUENCEFILE 的“国家”和“州”。
我现在尝试在 Impala 中使用以下命令将数据加载到表中,通过 Hue 编辑器运行 -
load data inpath '/usr/temp/input.txt'
into table partitioned_user
partition (country = 'US', state = 'CA');
我收到以下错误 -
AnalysisException:分区键值可能导致精度损失。需要将 ''US'' 转换为 'VARCHAR(64)' 用于分区列:国家
我做错了什么?我要插入的表具有诸如 VARCHAR(64) 类型的列 - first_name,last_name,country,state。
文件 input.txt 仅包含前两列的数据。我哪里错了?
【问题讨论】:
1. Hive/Impala 使用通用String
和 Varchar(x)
支持是后期和装饰性的添加2. 分区键被管理作为 metadata (在 Metastore DB + HDFS 目录名称中),不存储在数据文件中,因此它们使用不同的代码库,并且不能很好地支持任何不是普通的String
-with -alphanum-chars 或Int
3. Impala 和 Hive 在不同语言中具有不同的代码库,在 Hive 中有效的内容可能在 Impala 中无效 ==> 使用 String
进行分区键,然后在 Hive 和 Impala 中尝试你的命令,看看有什么效果。
【参考方案1】:
Impala 不会自动从较大的类型转换为较小的类型。您必须在插入之前将CAST()
转换为VARCHAR(64)
,以避免在 Impala 中出现此类异常。
partition (country = cast('US' as VARCHAR(64)), state = cast('CA' as VARCHAR(64)))
或者在 DDL 表中使用 STRING
数据类型。
【讨论】:
谢谢@leftjoin。有用。奇怪的是我确实放了一个演员并尝试过,它失败了。不知道现在是怎么执行成功的。以上是关于由于精度损失,无法将数据插入分区表的主要内容,如果未能解决你的问题,请参考以下文章