我有一些存储在HDFS中的JSON Snappy压缩文件,它们是HADOOP Snappy压缩的(而不是Python,与其他SO问题不同),并且具有嵌套结构。
我找不到将它们加载到HIVE(使用json_tuple)中的方法?
请给我提供一些资源/提示,以便我可以加载它们。
之前的参考资料(没有有效答案):
我有一些存储在HDFS中的JSON Snappy压缩文件,它们是HADOOP Snappy压缩的(而不是Python,与其他SO问题不同),并且具有嵌套结构。
我找不到将它们加载到HIVE(使用json_tuple)中的方法?
请给我提供一些资源/提示,以便我可以加载它们。
之前的参考资料(没有有效答案):
set hive.exec.compress.output=true;
set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;
set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;
set mapreduce.output.fileoutputformat.compress.type=BLOCK;
CREATE EXTERNAL TABLE mydirectory_tbl(
id string,
name string
)
ROW FORMAT SERDE
'org.openx.data.jsonserde.JsonSerDe'
LOCATION '/mydir' --this is HDFS/S3 location
;
JSONSerDe可以解析所有复杂结构,比使用json_tuple更容易。Json中的简单属性像表格列一样映射到列中,方括号 [] 中的所有内容都是数组<>,大括号 {}中的内容是一个 struct<> 或 map<>,复杂类型可以被嵌套。仔细阅读Readme:https://github.com/rcongiu/Hive-JSON-Serde, 有一个关于嵌套结构的部分和许多CREATE TABLE的示例。
如果还想使用json_tuple,则创建只有一个STRING列的表,然后使用 json_tuple 进行解析。但这将会更加困难。
所有JSON记录都应该在一行内(对象内没有换行符,也没有\r)。这和这里提到的一样:https://github.com/rcongiu/Hive-JSON-Serde
CREATE EXTERNAL TABLE IF NOT EXISTS database.table (
filename STRING,
cnt BIGINT,
size DOUBLE
) PARTITIONED BY ( \`date\` STRING )
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION 'folder/path/in/hdfs'
MSCK REPAIR TABLE database.table