如何在超过 3 个级别的配置单元中加载嵌套集合

How to load nested collections in hive with more than 3 levels

我正在努力将数据加载到 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... 加载的复杂结构 我试过 '[=13=]4'^D... 很多选项,但地图中的数据没有加载。

这是我最后一次尝试:

id_3054,2012-09-  22,3600000:TOT'[=11=]5'0.716'[=11=]4'PI'[=11=]5'0.093'[=11=]4'PII'[=11=]5'0.0'[=11=]4'PIII'[=11=]5'0.0'[=11=]4'PIV'[=11=]5'0.0'[=11=]4'RES'[=11=]5'0.0|7200000:TOT'[=11=]5'0.367'[=11=]4'PI'[=11=]5'0.066'[=11=]4'PII'[=11=]5'0.0'[=11=]4'PIII'[=11=]5'0.0'[=11=]4'PIV'[=11=]5'0.0'[=11=]4'RES'[=11=]5'0.0|10800000:TOT'[=11=]5'0.268'[=11=]4'PI'[=11=]5'0.02'[=11=]4'PII'[=11=]5'0.0'[=11=]4'PIII'[=11=]5'0.0'[=11=]4'PIV'[=11=]5'0.159'[=11=]4'RES'[=11=]5'0.0|14400000:TOT'[=11=]5'0.417'[=11=]4'PI'[=11=]5'0.002'[=11=]4'PII'[=11=]5'0.0'[=11=]4'PIII'[=11=]5'0.0'[=11=]4'PIV'[=11=]5'0.165'[=11=]4'RES'[=11=]5'0.0`

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

HIVE nested ARRAY in MAP data type

我正在使用来自 HDP 2.2 的图像

如有任何帮助,我们将不胜感激

谢谢

卡洛斯

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

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

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

以此类推

希望对您有所帮助!!

卡洛斯

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