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

时间:2015-05-20 23:15:55

标签: hadoop hive bigdata

我正在努力将数据加载到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...加载的复杂结构 我尝试使用'\004'^D ...有很多选项,但地图中的数据无法加载。

这是我的最后一次尝试:

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

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

HIVE nested ARRAY in MAP data type

我正在使用HDP 2.2中的图像

非常感谢任何帮助

由于

卡洛斯

2 个答案:

答案 0 :(得分:0)

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

经过多次测试后,我最终用HEX编辑器编辑了我的文件,插入了正确的值,但是我怎么能用Java做到这一点?可以更简单:只需将一个int转换为char,这将生成相应的ASCII字符:

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

等等。

希望这会有所帮助!!

卡洛斯

答案 1 :(得分:0)

您可以将Parive或ORC格式的Hive表存储在原生且更有效的嵌套结构中。