首先,如果遇到措辞不佳表示歉意,我已尽力帮助自己,但不清楚在哪里不合适。
我正在尝试在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”,但这给出了相同的结果。
任何帮助将不胜感激。
答案 0 :(得分:0)
文件名并不重要,只要它们不是某些特殊文件(例如_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;
用于创建外部 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表概述。