提问者:小点点

在Impala中使用外部创建的Parquet文件


首先,如果遇到措辞拙劣的问题,请道歉,我已经尽力帮助自己,但我不清楚哪里不对。

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

我们遇到了一些问题,一些字段有换行符,这使得我们看起来有更多的数据,它不一定适合我创建的元数据。
有人建议我们可以使用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创建一个存储为parquet的表,然后执行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中创建表以接受我收到的内容,我只需要. parque文件还是还需要放入.parque.crc文件?

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

我试着看黑斑羚留档,但我不认为这是覆盖它。
这是我需要用serde做的事情吗?
我试图指定compression_codec为快速,但这给出了相同的结果。

任何帮助将不胜感激。


共1个答案

匿名用户

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

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

>

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

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

    将外部文件放入表中后,您必须发出INVALIDATE METADATAtable_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表概述。