如何在超过 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 格式,这些格式原生支持嵌套结构并且更有效。
我正在努力将数据加载到 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 格式,这些格式原生支持嵌套结构并且更有效。