由于精度损失,无法将数据插入分区表

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 使用通用 StringVarchar(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。有用。奇怪的是我确实放了一个演员并尝试过,它失败了。不知道现在是怎么执行成功的。

以上是关于由于精度损失,无法将数据插入分区表的主要内容,如果未能解决你的问题,请参考以下文章

lvm的基本创建

由于失败,无法执行 hive 交换分区:分区已存在

hive 插入parquet二级分区表数据倾斜优化

将数据插入 Hive 分区表时出错

SQL 分区表 - 如何将不需要分区的数据插入分区表?

由于 parquet 文件损坏,Impala 无法创建分区表