首先,道歉如果这是一个糟糕的措辞,我试图帮助自己,但我不清楚哪里是不正确的。
我正在尝试查询从另一个系统导出的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创建一个存储为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中创建表以接受我收到的内容,并且我是否只需要其中的.parquet文件,或者我是否还需要将.parquet.crc文件放入其中?
或者我收到的东西不适合我的目的?
我已经试着看了 Impala 的文档,但我不认为这涵盖了它。
我需要和塞德谈谈吗?
我试着将压缩编码解码器指定为snappy,但得到了相同的结果。
任何帮助都将不胜感激。
1条答案
按热度按时间2wnc66cl1#
文件的名称无关紧要,只要它们不是一些特殊的文件(如
_SUCCESS
或者.something.crc
),它们将作为Parquet文件被 Impala 读取。你不需要.crc
或者_SUCCESS
文件夹。在impala中,可以通过两种方式使用来自外部源的Parquet文件:
首先在impala中创建一个parquet表,然后将外部文件放入对应于该表的目录中。
创建一个目录,将外部文件放入其中,然后在impala中创建一个所谓的外部表(以后也可以将更多的数据文件放在那里。)
将外部文件放入表后,必须发出
INVALIDATE METADATA table_name;
使 Impala 检查新文件。创建常规Parquet表的语法如下
创建外部Parquet表的语法如下
摘自文件“ Impala 表概述”部分:
在物理上,每个使用hdfs存储的表都与hdfs中的一个目录相关联。表数据由该目录下的所有数据文件组成:
内部表由impala管理,并使用指定impala工作区内的目录。
外部表使用任意hdfs目录,其中数据文件通常在不同的hadoop组件之间共享。
文档的create table语句部分摘录:
默认情况下,impala创建一个“内部”表,impala在其中管理表的基础数据文件,并在删除表时从物理上删除数据文件。如果指定external子句,impala会将该表视为“external”表,其中数据文件通常在impala外部生成,并从hdfs中的原始位置进行查询,当您删除该表时,impala会将数据文件保留在原位。有关内部和外部表的详细信息,请参见impala表概述。