【问题标题】:How to merge orc files for external tables?如何合并外部表的orc文件?
【发布时间】:2018-05-27 10:28:59
【问题描述】:

我正在尝试合并多个小的 ORC 文件。遇到 ALTER TABLE CONCATENATE 命令,但仅适用于托管表。

当我尝试运行 Hive 时,它​​给了我以下错误:

失败:语义异常 org.apache.hadoop.hive.ql.parse.SemanticException:连接/合并 只能在托管表上执行

以下是表格参数:

Table Type:             EXTERNAL_TABLE
Table Parameters:
    COLUMN_STATS_ACCURATE   true
    EXTERNAL                TRUE
    numFiles                535
    numRows                 27051810
    orc.compress            SNAPPY
    rawDataSize             20192634094
    totalSize               304928695
    transient_lastDdlTime   1512126635

# Storage Information
SerDe Library:          org.apache.hadoop.hive.ql.io.orc.OrcSerde
InputFormat:            org.apache.hadoop.hive.ql.io.orc.OrcInputFormat
OutputFormat:           org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat
Compressed:             No
Num Buckets:            -1
Bucket Columns:         []
Sort Columns:           []
Storage Desc Params:
    serialization.format    1

【问题讨论】:

  • 需要合并成单独的表
  • 作为reported by @leftjoin,我可以确认ALTER TABLE .. PARTITION .. CONCATENATE 为我的Hive EXTERNAL 表工作(数据存储在S3)。我在emr-5.20.0 上使用Hive 2.3.4 [我通过Spark 插入数据]

标签: hadoop hive hdfs orc


【解决方案1】:

我相信你的表是一个外部表,那么有两种方法:

  1. 您可以将其更改为托管表(ALTER TABLE <table> SET TBLPROPERTIES('EXTERNAL'='FALSE') 并运行ALTER TABLE CONCATENATE。然后您可以将其转换回外部更改 发给TRUE
  2. 或者您可以使用CTAS 创建托管表并插入数据。然后运行合并查询并将数据导入回外部表

【讨论】:

  • 在运行 ALTER CONCATENATE 之前我们应该设置 external=false 的任何原因?
  • 整个查询都与此相关。正如用户提到的,他面临错误,因为它是用于执行 Alter 命令的外部表。所以你需要把它改成 Managed 然后运行 ​​alter 命令。
  • 感谢您的快速回复。我也有类似的用例来合并外部表上的 ORC 文件。但是,我能够在不设置 external=false 的情况下运行(没有错误)更改连接查询。但是小文件的连接与外部表的行为不符。因此,想知道将 table 设置为 external=false 或 managed table 的原因。
【解决方案2】:

从我之前对this question 的回答来看,这是一个使用PyORC 将小的ORC 文件连接在一起的Python 小脚本。它根本不使用 Hive,因此只有在您可以直接访问文件并且能够在它们上运行 Python 脚本时才能使用它,而托管主机中可能并非总是如此。

import pyorc
import argparse


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('-o', '--output', type=argparse.FileType(mode='wb'))
    parser.add_argument('files', type=argparse.FileType(mode='rb'), nargs='+')
    args = parser.parse_args()

    schema = str(pyorc.Reader(args.files[0]).schema)

    with pyorc.Writer(args.output, schema) as writer:
        for i, f in enumerate(args.files):
            reader = pyorc.Reader(f)
            if str(reader.schema) != schema:
                raise RuntimeError(
                    "Inconsistent ORC schemas.\n"
                    "\tFirst file schema: {}\n"
                    "\tFile #{} schema: {}"
                    .format(schema, i, str(reader.schema))
                )
            for line in reader:
                writer.write(line)


if __name__ == '__main__':
    main()

【讨论】:

    猜你喜欢
    • 2018-10-07
    • 2018-04-10
    • 1970-01-01
    • 2020-10-03
    • 2018-06-09
    • 2018-06-10
    • 2020-08-14
    • 2014-01-05
    • 1970-01-01
    相关资源
    最近更新 更多