在 Impala 中使用外部创建的 Parquet 文件
Posted
技术标签:
【中文标题】在 Impala 中使用外部创建的 Parquet 文件【英文标题】:Using Externally created Parquet files in Impala 【发布时间】:2019-01-23 10:50:53 【问题描述】:首先,如果措辞不当,我深表歉意,我试图帮助自己,但我不清楚哪里不对。
我正在尝试在 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 文件在哪里?
或者我收到的东西不符合目的?
我已尝试查看 the Impala documentation 的这一点,但我认为这并没有涵盖它。 我需要用 serde 做些什么吗? 我尝试将compression_codec 指定为snappy,但这给出了相同的结果。
任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:文件名无关紧要,只要它们不是一些特殊文件(如_SUCCESS
或.something.crc
),Impala 会将它们作为 Parquet 文件读取。您不需要 .crc
或 _SUCCESS
文件。
您可以通过两种方式在 Impala 中使用来自外部源的 Parquet 文件:
首先在 Impala 中创建 Parquet 表,然后将外部文件放入该表对应的目录中。
创建一个目录,将外部文件放入其中,然后在 Impala 中创建一个所谓的 external 表。 (您也可以稍后将更多数据文件放在那里。)
将外部文件放入表后,您必须发出INVALIDATE METADATA table_name;
以使Impala 检查新文件。
创建常规 Parquet 表的语法是
CREATE TABLE table_name (col_name data_type, ...)
STORED AS PARQUET;
创建external Parquet 表的语法是
CREATE EXTERNAL TABLE table_name (col_name data_type, ...)
STORED AS PARQUET LOCATION '/path/to/directory';
摘自文档的Overview of Impala Tables 部分:
物理上,每个使用 HDFS 存储的表都与 HDFS 中的一个目录相关联。表数据由该目录下的所有数据文件组成:
内部表由 Impala 管理,并使用指定 Impala 工作区内的目录。 外部表使用任意 HDFS 目录,其中数据文件通常在不同的 Hadoop 组件之间共享。
摘自文档的CREATE TABLE Statement 部分:
默认情况下,Impala 创建一个“内部”表,其中 Impala 管理表的基础数据文件,并在您删除表时物理删除数据文件。如果您指定 EXTERNAL 子句,Impala 会将表视为“外部”表,其中数据文件通常在 Impala 外部生成并从它们在 HDFS 中的原始位置进行查询,当您删除表时,Impala 将数据文件留在原处。有关内部和外部表的详细信息,请参阅 Impala 表概述。
【讨论】:
以上是关于在 Impala 中使用外部创建的 Parquet 文件的主要内容,如果未能解决你的问题,请参考以下文章
使用 Impala 在 INSERT INTO (Parquet) TABLE 期间对分区键进行排序
由于 parquet 文件损坏,Impala 无法创建分区表