问题描述
我在HDFS中有一堆json快照压缩文件。 它们是HADOOP快速压缩的(不是python,请参阅其他SO问题) 并具有嵌套结构。
找不到将它们加载到其中的方法 进入HIVE(使用json_tuple)?
以前的参考文献(没有有效的答案)
pyspark how to load compressed snappy file
解决方法
- 将所有文件放在HDFS文件夹中,并在其顶部创建外部表。如果文件具有.snappy之类的名称,则Hive会自动识别它们,尽管您可以指定
TBLPROPERTIES ("orc.compress"="SNAPPY")
CREATE EXTERNAL TABLE mydirectory_tbl(
id string,name string
)
ROW FORMAT SERDE
'org.openx.data.jsonserde.JsonSerDe'
LOCATION '/mydir' --this is HDFS/S3 location
TBLPROPERTIES ("orc.compress"="SNAPPY")
;
-
JSONSerDe可以解析所有复杂的结构,比使用json_tuple容易得多。 json中的简单属性按原样映射到列。方括号中的所有内容[]是一个数组,在{}中是struct 或map ,可以嵌套复杂类型。仔细阅读自述文件:https://github.com/rcongiu/Hive-JSON-Serde。其中有一个关于嵌套结构的部分,以及有关CREATE TABLE的许多示例。
-
如果您仍然想使用json_tuple,则创建具有单个STRING列的表,然后使用json_tuple进行解析。但这要困难得多。
-
所有JSON记录都应位于单行中(JSON对象中以及\ r中都不应包含换行符)。这里https://github.com/rcongiu/Hive-JSON-Serde
如果您的数据已分区(例如按日期)
在Hive中创建表
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