【问题标题】:Data not getting loaded into Partitioned Table in Hive数据未加载到 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后也没有正常工作。

还有其他事情要做。

【问题讨论】:

    标签: hadoop mapreduce hive partition


    【解决方案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】:
          猜你喜欢
          • 2015-03-07
          • 2012-10-20
          • 2021-06-22
          • 1970-01-01
          • 2016-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多