如何在蜂巢中加载超过3个级别的嵌套集合



我正在努力将数据加载到Hive中,定义如下:

CREATE TABLE complexstructure (
id STRING,
date DATE,
day_data ARRAY<STRUCT<offset:INT,data:MAP<STRING,FLOAT>>>
) row format delimited
fields terminated by ','
collection items terminated by '|'
map keys terminated by ':';

day_data字段包含一个难以用load data inpath...加载的复杂结构我试过'04', ^D…选项很多,但是地图中的数据不会被加载。

这是我最后一次尝试:

id_3054,2012-09-  22,3600000:TOT'05'0.716'04'PI'05'0.093'04'PII'05'0.0'04'PIII'05'0.0'04'PIV'05'0.0'04'RES'05'0.0|7200000:TOT'05'0.367'04'PI'05'0.066'04'PII'05'0.0'04'PIII'05'0.0'04'PIV'05'0.0'04'RES'05'0.0|10800000:TOT'05'0.268'04'PI'05'0.02'04'PII'05'0.0'04'PIII'05'0.0'04'PIV'05'0.159'04'RES'05'0.0|14400000:TOT'05'0.417'04'PI'05'0.002'04'PII'05'0.0'04'PIII'05'0.0'04'PIV'05'0.165'04'RES'05'0.0`

在发布这里之前,我已经尝试了(很多很多)选项,这个例子不起作用:

MAP数据类型中的HIVE嵌套数组

我使用的图像来自HDP 2.2

如有任何帮助,不胜感激

感谢卡洛斯

所以最后我找到了一个从java生成文件的好方法。窍门是Hive使用前8个ASCII字符作为分隔符,但是您只能覆盖前三个字符。从第四个开始,您需要生成三个实际的ASCII字符。

经过多次测试,我最终用HEX编辑器编辑了我的文件,并插入了正确的值,但是我如何在Java中做到这一点?再简单不过了:只需将int类型强制转换为char类型,就会生成相应的ASCII字符:

ASCII 4 -> ((char)4)
ASCII 5 -> ((char)5)
...

等等

希望这有帮助!!

卡洛斯

您可以将Hive表存储为Parquet或ORC格式,这些格式支持本地嵌套结构,并且更有效。

相关内容

  • 没有找到相关文章

最新更新