【问题标题】:Is it possible to convert a hive table format to ORC and make it bucketed是否可以将配置单元表格式转换为 ORC 并使其分桶
【发布时间】:2019-10-30 02:58:47
【问题描述】:

我有一组非 ORC 格式且未分桶的配置单元表。我想将它们的格式更改为 ORC 并将它们放入桶中。在整个网络中找不到具体的答案。任何答案或指导表示赞赏。 Hive 版本是 2.3.5

或者如果可以在 spark (pyspark 或 scala) 中做到这一点?

最简单的解决方案是创建一个存储桶并采用 ORC 格式的新表,然后从旧表中插入该表。寻找就地解决方案。

【问题讨论】:

    标签: hive orc acid


    【解决方案1】:

    蜂巢: 使用临时表读取未分桶的数据(假设为TEXTFILE 格式),使用以下命令:

    CREATE TABLE staging_table(
        col1 colType, 
        col2 colType, ...
        coln colType
    )
    STORED AS 
        TEXTFILE
    LOCATION 
        '/path/of/input/data';
    
    CREATE TABLE target_table(
        col1 colType, 
        col2 colType, ...
        coln colType
    )
    CLUSTERED BY(col1) INTO 10 BUCKETS
    STORED AS ORC;
    
    INSERT OVERWRITE TABLE table_bucketed
    SELECT 
        col1, col2, ..., coln
    FROM 
        staging_table;
    

    同样可以用**Spark** DataFrame APIs(假设CSV格式)像这样:

    df = spark.read.format("csv")
              .option("inferSchema", "true")
              .option("header", "true")
              .option("delimiter", ",")
              .option("path", "/path/of/input/data/")
              .load()
    
    df.write.format("orc")
            .option("path", "/path/of/output/data/")
            .save()
    

    【讨论】:

    • 这不是就地解决方案。我已经知道如何创建一个表并插入其中。
    • 如果您的意思是更改现有 Hive 表的存储格式(例如从 TEXTFILE 到 ORC)并使其分桶,那么 Hive 不支持此功能。但是,如果您现有的表是外部表,那么您可以使用 Spark 更改存储格式和路径,使目标路径与该外部表的路径相同。然后,您可以更改 table 命令以将表 SerDe 从 SimpleSerDe2 更改为 ORC。但是您仍然无法将表格放入桶中。
    • 所以有可能表的存储类型可以间接改变数据格式(使用 Hive/Spark 进行格式和路径操作),但是现有的非分桶表无法转换为分桶。
    【解决方案2】:

    创建bucketed table 并使用INSERT OVERWRITE 将数据加载到其中:

    CREATE TABLE table_bucketed(col1 string, col2 string)
    CLUSTERED BY(col1) INTO 10 BUCKETS
    STORED AS ORC;
    
    INSERT OVERWRITE TABLE table_bucketed
    select ...
      from table_not_bucketed
    

    另见Sorted Bucketed Table.

    【讨论】:

    • 我创建了一个 ORC 格式的新表,该表被存储并从 Avro 格式的表中插入。当我想测试新表并从中选择时,它会给出错误,例如 Caused by: java.io.IOException: Error reading file:Caused by: java.io.EOFException : 读取压缩流的 EOF 流的第 44 列数据位置:0 长度:0 范围:0 偏移量:0 限制:0
    • 在 org.apache.hadoop.hive.io.HiveIOExceptionHandlerChain.handleRecordReaderNextException(HiveIOExceptionHandlerChain.java:121) 在 org.apache.hadoop.hive.io.HiveIOExceptionHandlerUtil.handleRecordReaderNextException(HiveIOExceptionHandlerUtil.java:77)在 org.apache.hadoop.hive.shims.HadoopShimsSecure$CombineFileRecordReader.doNextWithExceptionHandler(HadoopShimsSecure.java:232) 在 org.apache.hadoop.hive.shims.HadoopShimsSecure$CombineFileRecordReader.next(HadoopShimsSecure.java:142) 在 org.apache .hadoop.mapred.MapTask$TrackedRecordReader.moveToNext(MapTask.java:199)
    • org.apache.hadoop.mapred.MapTask$TrackedRecordReader.next(MapTask.java:185) at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:52) at org. apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:459) 在 org.apache.hadoop.mapred.MapTask.run(MapTask.java:343) 在 org.apache.hadoop.mapred.YarnChild$2.run(YarnChild .java:177) 在 java.security.AccessController.doPrivileged(Native Method) 在 javax.security.auth.Subject.doAs(Subject.java:422) 在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java :1893) 在 org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:171)
    • 在 org.apache.hadoop.hive.io.HiveIOExceptionHandlerChain.handleRecordReaderNextException(HiveIOExceptionHandlerChain.java:121) 在 org.apache.hadoop.hive.io.HiveIOExceptionHandlerUtil.handleRecordReaderNextException(HiveIOExceptionHandlerUtil.java:77) org.apache.hadoop.hive.ql.io.HiveContextAwareRecordReader.doNext(HiveContextAwareRecordReader.java:365) org.apache.hadoop.hive.ql.io.CombineHiveRecordReader.doNext(CombineHiveRecordReader.java:167) org.apache .hadoop.hive.ql.io.CombineHiveRecordReader.doNext(CombineHiveRecordReader.java:52)
    • 在 org.apache.hadoop.hive.ql.io.HiveContextAwareRecordReader.next(HiveContextAwareRecordReader.java:116) 在 org.apache.hadoop.hive.shims.HadoopShimsSecure$CombineFileRecordReader.doNextWithExceptionHandler(HadoopShimsSecure. java:229)
    猜你喜欢
    • 2019-07-01
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 2016-10-22
    • 2016-08-26
    • 2017-09-26
    • 2019-11-30
    相关资源
    最近更新 更多