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

时间:2019-01-23 10:50:53

标签: parquet create-table impala

首先,如果遇到措辞不佳表示歉意,我已尽力帮助自己,但不清楚在哪里不合适。

我正在尝试在Impala中查询从其他系统导出的数据。 到目前为止,它已导出为管道分隔的文本文件,通过使用正确的定界符设置创建表,将其复制到文件中,然后运行refresh语句,我已经能够导入该文件。 / p>

我们遇到了一些问题,其中某些字段具有换行符,这使我们看起来好像拥有更多的数据,并且不一定适合我创建的元数据。
有人建议我们可以改用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 个答案:

答案 0 :(得分:0)

文件名并不重要,只要它们不是某些特殊文件(例如_SUCCESS.something.crc),Impala就会将它们作为Parquet文件读取。您不需要.crc_SUCCESS文件。

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

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

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

在将外部文件放入表中之后,您必须发出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';

文档Overview of Impala Tables部分的摘录:

  

从物理上讲,每个使用HDFS存储的表都与HDFS中的目录相关联。表数据包含该目录下的所有数据文件:

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

文档CREATE TABLE Statement部分的摘录:

  

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