我正在尝试为我的表创建分区以便更新值。
这是我的样本数据
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
后也无法正常工作。
还有别的事要做。
答案 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)
您可以尝试跑步吗 MSCK REPAIR TABLE table_name;