数据未加载到 Hive 中的分区表中

Posted

技术标签:

【中文标题】数据未加载到 Hive 中的分区表中【英文标题】:Data not getting loaded into Partitioned Table in Hive 【发布时间】:2014-11-12 09:35:52 【问题描述】:

我正在尝试为我的表创建分区以更新值。

这是我的示例数据

1,Anne,Admin,50000,A
2,Gokul,Admin,50000,B
3,Janet,Sales,60000,A

我想将Janet's部门更新为B

为此,我创建了一个以 Department 为分区的表。

创建外部表跟踪(EmployeeID Int,FirstName String,Designation String,Salary Int) PARTITIONED BY (Department) 字符串)行格式分隔字段以“,”位置终止 '/user/sreeveni/HIVE';

但是在执行上述命令时。 没有数据插入到跟踪表中。

hive>select * from trail;                               
OK
Time taken: 0.193 seconds

hive>desc trail;                                        
OK
employeeid              int                     None                
firstname               string                  None                
designation             string                  None                
salary                  int                     None                
department              string                  None                

# Partition Information      
# col_name              data_type               comment             

department              string                  None   

我做错了什么吗?

更新

按照建议,我尝试将数据插入到我的表中

将路径中的数据“/user/aibladmin/HIVE”覆盖到表跟踪中 分区(部门);

但它正在显示

失败:SemanticException [错误 10096]:动态分区严格模式 至少需要一个静态分区列。关闭此设置 hive.exec.dynamic.partition.mode=nonstrict

设置set hive.exec.dynamic.partition.mode=nonstrict后也没有正常工作。

还有其他事情要做。

【问题讨论】:

【参考方案1】:

尝试以下两个属性

SET hive.exec.dynamic.partition = true;
SET hive.exec.dynamic.partition.mode = nonstrict;

在为分区表编写插入语句时,请确保在 select 子句的最后指定分区列。

【讨论】:

我试图 insert into select 到一个分区表。数据只有 13k 条记录。使用上述设置后,查询运行。但我得到内存运行我们的问题。奇怪,对于一个相当小的数据,它不应该耗尽内存。【参考方案2】:

您不能直接将数据(Hdfs 文件)插入分区配置单元表。 首先您需要创建一个普通表,然后将该表数据插入到分区表中。

set hive.exec.dynamic.partition.mode=strict 表示当您填充 hive 表时,它必须至少有一个静态分区列。

set hive.exec.dynamic.partition.mode=nonstrict在这种模式下你不需要任何静态分区列。

【讨论】:

如何创建静态分区列?【参考方案3】:

尝试以下方法:

从创建表开始:

create external table test23 (EmployeeID Int,FirstName String,Designation String,Salary Int) PARTITIONED BY (Department String) row format delimited fields terminated by "," location '/user/rocky/HIVE';

在 hdfs 中创建一个带有分区名称的目录:

$ hadoop fs -mkdir /user/rocky/HIVE/department=50000

通过过滤部门等于50000的记录创建本地文件abc.txt

$ cat abc.txt 
1,Anne,Admin,50000,A
2,Gokul,Admin,50000,B

放入HDFS:

$ hadoop fs -put /home/yarn/abc.txt /user/rocky/HIVE/department=50000

现在修改表格:

ALTER TABLE test23 ADD PARTITION(department=50000);

并检查结果:

select * from test23 ;

【讨论】:

【参考方案4】:

只需在您getOrCreate() spark 会话之前设置这两个属性:

SparkSession
    .builder
    .config(new SparkConf())
    .appName(appName)
    .enableHiveSupport()
    .config("hive.exec.dynamic.partition","true")
    .config("hive.exec.dynamic.partition.mode", "nonstrict")
    .getOrCreate()

【讨论】:

【参考方案5】:

我遇到了同样的问题,是的,这两个属性是必需的。但是,我使用 Scala 的 JDBC 驱动程序在执行 Hive 语句之前设置这些属性。然而,问题是我在这样的一个执行语句中执行了一堆属性(SET 语句)

     conn = DriverManager.getConnection(conf.get[String]("hive.jdbc.url"))
     conn.createStatement().execute(
"SET spark.executor.memory = 2G;
SET hive.exec.dynamic.partition.mode = nonstrict; 
SET hive.other.statements =blabla  ;") 

由于某种原因,驱动程序无法将所有这些解释为单独的语句,因此我需要分别执行它们中的每一个。

  conn = DriverManager.getConnection(conf.get[String]("hive.jdbc.url"))
    conn.createStatement().execute("SET spark.executor.memory = 2G;")
    conn.createStatement().execute("SET hive.exec.dynamic.partition.mode=nonstrict;") 
   conn.createStatement().execute("SET hive.other.statements =blabla  ;") 

【讨论】:

【参考方案6】:

你能试试跑步吗 MSCK REPAIR TABLE 表名;

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-RecoverPartitions(MSCKREPAIRTABLE)

【讨论】:

以上是关于数据未加载到 Hive 中的分区表中的主要内容,如果未能解决你的问题,请参考以下文章

如果未添加新分区,则需要 hive 每日 msck 修复

无法查看 hive 分区表中的数据

使用 ALTER 添加新列后,数据错误地加载到 Hive 分区表中

利用oozie,执行sqoop action将DB2中的数据导入到hive分区表中

HIVE:在分区表中映射联接

通过 pig 脚本删除 hive 表分区