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

时间:2014-09-18 06:46:12

标签: hadoop mapreduce hive partition

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

这是我的样本数据

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

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

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

  

创建外部表跟踪(EmployeeID Int,FirstName   字符串,指定字符串,工资Int)分区(部门   字符串)行格式分隔的字段由","终止。地点   ' /用户/ sreeveni / HIVE&#39 ;;

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

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'中加载数据覆盖到表格中   分区(部);

但它正在显示

  

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

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

还有别的事要做。

5 个答案:

答案 0 :(得分:13)

尝试以下属性

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

在为分区表编写insert语句时,请确保在select子句中指定最后一个分区列。

答案 1 :(得分:2)

尝试以下方法:

首先创建表格:

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 ;

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:0)

我遇到了同样的问题,是的,这两个属性是必需的。但是,在执行Hive语句之前,我将JDBC驱动程序与Scala一起使用来设置这些属性。但是问题是,我正在这样的一条执行语句中执行一堆属性(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  ;") 

答案 4 :(得分:0)