当前位置: 首页 > 知识库问答 >
问题:

镶木地板支持的蜂巢表:在Impala中不可查询数组列

师俊健
2023-03-14

虽然 Impala 比 Hive 快得多,但我们之所以使用 Hive,是因为它支持复杂(嵌套)数据类型,如数组和映射。

我注意到,从CDH5.5开始,Impala现在支持复杂的数据类型。由于在黑斑羚中也可以运行蜂巢UDF,我们可能可以在黑斑中做任何我们想做的事情,但要快得多。这是个好消息!

当我浏览文档时,我看到Impala希望以镶木地板格式存储数据。我的数据,在原始形式中,恰好是一个两列的CSV,其中第一列是一个ID,第二列是一个管道分隔的字符串数组,例如:

123,ASDFG|SDFGH|DFGHJ|FGHJK
234,QWERT|WERTY|ERTYU

已创建 Hive 表:

CREATE TABLE `id_member_of`(
  `id` INT, 
  `member_of` ARRAY<STRING>)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY ',' 
  COLLECTION ITEMS TERMINATED BY '|' 
  LINES TERMINATED BY '\n' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.html" target="_blank">mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';

原始数据被加载到Hive表中:

LOAD DATA LOCAL INPATH 'raw_data.csv' INTO TABLE id_member_of;

创建了桌子的镶木地板版本:

CREATE TABLE `id_member_of_parquet` (
 `id` STRING, 
 `member_of` ARRAY<STRING>) 
STORED AS PARQUET;

CSV支持的表中的数据被插入拼花表中:

INSERT INTO id_member_of_parquet SELECT id, member_of FROM id_member_of;

现在可以在Hive中查询拼花表:

hive> select * from id_member_of_parquet;
123 ["ASDFG","SDFGH","DFGHJ","FGHJK"]
234 ["QWERT","WERTY","ERTYU"]

奇怪的是,当我在 Impala 中查询同一个 Parquet 支持的表时,它不会返回数组列:

[hadoop01:21000] > invalidate metadata;
[hadoop01:21000] > select * from id_member_of_parquet;
+-----+
| id  |
+-----+
| 123 |
| 234 |
+-----+

问:数组列怎么了?你能看出我做错了什么吗?

共有1个答案

唐宇定
2023-03-14

事实证明非常简单:我们可以通过用点将数组添加到< code>FROM来访问数组,例如

Query: select * from id_member_of_parquet, id_member_of_parquet.member_of
+-----+-------+
| id  | item  |
+-----+-------+
| 123 | ASDFG |
| 123 | SDFGH |
| 123 | DFGHJ |
| 123 | FGHJK |
| 234 | QWERT |
| 234 | WERTY |
| 234 | ERTYU |
+-----+-------+
 类似资料:
  • 我试图创建一个Hive表与模式字符串,字符串,双在包含两个拼花文件的文件夹上。第一个拼花文件模式是字符串,字符串,双,第二个文件的模式是字符串,双,字符串。 我正在尝试使用pig(0.14)脚本中的hive表。 但我得到了错误 java.lang.UnsupportedOperationException:无法检查org.apache.hadoop.hive.serde2.io.DoubleWri

  • 我正在尝试创建一个数据管道,其中incomng数据存储在parquet中,我创建了一个外部配置单元表,用户可以查询配置单元表并检索数据。我可以保存parquet数据并直接检索它,但当我查询配置单元表格时,它不会返回任何行。我做了以下测试设置: -创建外部配置单元表创建外部表emp ( id double,hire_dt时间戳,用户字符串)存储为parquet location '/test/EMP

  • 我正在尝试将存储在HDFS(100Gbs)上的一堆多部分avro文件转换为拼花文件(保留所有数据) Hive可以使用以下命令将avro文件作为外部表读取: 但是当我试图设计一张拼花桌时: 它会抛出一个错误: 失败:执行错误,从org.apache.hadoop.hive.ql.exec.DDLTask返回代码1。java.lang.UnsupportedOperationException:未知字

  • Impala中不支持蜂巢日期格式。 我在配置单元表中创建了分区日期列,但当我可以从impala中的hive_metadata访问相同的表时,它会显示

  • 我无法使用镶木地板文件将列的类型从更改为。 使用: 改变表DATABASE.TABLE改变COL INT(从字符串到int) 或 < code >更改表数据库。表格更改列列字符串(从int到string) 读取数据时产生错误: 文件x的“db.table.col”列具有不兼容的拼花架构。列类型:INT,拼花模式:可选byte_array col[i:1 d:1 r:0] 读了这个留档,我明白: T

  • 问题内容: 有没有办法从Java创建镶木地板文件? 我的内存中有数据(java类),我想将其写入一个Parquet文件中,以便以后从apache-drill中读取它。 有没有简单的方法可以做到这一点,例如将数据插入sql表? 得到它了 谢谢您的帮助。 结合答案和此链接,我能够创建一个实木复合地板文件并用钻头将其读回。 问题答案: 不建议使用ParquetWriter的构造函数(1.8.1),但不建