首页 > 解决方案 > 在 Impala 中使用外部创建的 Parquet 文件

问题描述

首先,如果措辞不当,我深表歉意,我试图帮助自己,但我不清楚哪里不对。

我正在尝试查询从另一个系统导出的 Impala 中的数据。到目前为止,它已导出为管道分隔的文本文件,我可以通过创建具有正确分隔符设置的表、复制文件然后运行refresh语句来很好地导入该文件。

我们遇到了一些问题,其中某些字段有换行符,这使得我们看起来有更多数据,但不一定适合我创建的元数据。
有人建议我们可以改用 Parquet 格式,这样可以很好地处理内部换行符。

我收到了数据,看起来有点像这样(我更改了用户名):

-rw-r--r--+ 1 UserName Domain Users  20M Jan 17 10:15 part-00000-6a763116-6728-4467-a641-32dd710857fe.snappy.parquet
-rw-r--r--+ 1 UserName Domain Users 156K Jan 17 10:15 .part-00000-6a763116-6728-4467-a641-32dd710857fe.snappy.parquet.crc
-rw-r--r--+ 1 UserName Domain Users  14M Jan 17 10:15 part-00001-6a763116-6728-4467-a641-32dd710857fe.snappy.parquet
-rw-r--r--+ 1 UserName Domain Users 110K Jan 17 10:15 .part-00001-6a763116-6728-4467-a641-32dd710857fe.snappy.parquet.crc
-rw-r--r--+ 1 UserName Domain Users    0 Jan 17 10:15 _SUCCESS
-rw-r--r--+ 1 UserName Domain Users    8 Jan 17 10:15 ._SUCCESS.crc

如果我通过 Impala 创建一个存储为镶木地板的表,然后对其进行操作hdfs dfs -ls,我会得到如下内容:

-rwxrwx--x+  3 hive hive       2103 2019-01-23 10:00 /filepath/testtable/594eb1cd032d99ad-5c13d29e00000000_1799839777_data.0.parq
drwxrwx--x+  - hive hive          0 2019-01-23 10:00 /filepath/testtable/_impala_insert_staging

这显然与我收到的有点不同......

如何在 Impala 中创建表格以便能够接受我收到的内容,并且我只需要.parquet文件还是需要将.parquet.crc文件放入其中?

还是我收到的东西不符合目的?

我已经尝试查看Impala 文档以了解这一点,但我认为这并没有涵盖它。
我需要用 serde 做些什么吗?
我尝试将compression_codec 指定为snappy,但这给出了相同的结果。

任何帮助,将不胜感激。

标签: parquetcreate-tableimpala

解决方案


文件的名称无关紧要,只要它们不是一些特殊文件(如_SUCCESS.something.crc),它们将被 Impala 读取为 Parquet 文件。您不需要.crcor_SUCCESS文件。

您可以通过两种方式在 Impala 中使用来自外部源的 Parquet 文件:

  1. 首先在 Impala 中创建一个 Parquet 表,然后将外部文件放入该表对应的目录中。

  2. 创建一个目录,将外部文件放入其中,然后在 Impala 中创建一个所谓的外部表。(您也可以稍后将更多数据文件放在那里。)

将外部文件放入表中后,您必须发出INVALIDATE METADATA table_name;命令让 Impala 检查新文件。

创建常规 Parquet 表的语法是

CREATE TABLE table_name (col_name data_type, ...)
  STORED AS PARQUET;

创建外部Parquet 表的语法是

CREATE EXTERNAL TABLE table_name (col_name data_type, ...)
  STORED AS PARQUET LOCATION '/path/to/directory';

文档的 Impala 表概述部分的摘录:

在物理上,每个使用 HDFS 存储的表都与 HDFS 中的一个目录相关联。表数据由该目录下的所有数据文件组成:

  • 内部表由 Impala 管理,并使用指定 Impala 工作区内的目录。
  • 外部表使用任意 HDFS 目录,其中数据文件通常在不同的 Hadoop 组件之间共享。

摘自文档的CREATE TABLE 语句部分:

默认情况下,Impala 创建一个“内部”表,其中 Impala 管理表的基础数据文件,并在您删除表时物理删除数据文件。如果您指定 EXTERNAL 子句,Impala 会将表视为“外部”表,其中数据文件通常在 Impala 外部生成并从它们在 HDFS 中的原始位置查询,当您删除表时,Impala 将数据文件留在原处。有关内部和外部表的详细信息,请参阅 Impala 表概述。


推荐阅读