如何在HIVE中加载经过json snappy压缩的数据

5

我有一些存储在HDFS中的JSON Snappy压缩文件,它们是HADOOP Snappy压缩的(而不是Python,与其他SO问题不同),并且具有嵌套结构。

我找不到将它们加载到HIVE(使用json_tuple)中的方法?

请给我提供一些资源/提示,以便我可以加载它们。

之前的参考资料(没有有效答案):

pyspark如何加载压缩的snappy文件

Hive: 解析JSON


你可以使用Spark来加载Snappy压缩文件并写入Hive表。这个方法不起作用吗? - Srinivas
不,我没有足够大的火花。需要使用HIVE。 - tensor
好的,您可以使用json serde创建一个外部表,其模式与json snappy文件相同。 - Srinivas
2个回答

4
  1. 将所有文件放入HDFS文件夹中,并在其上创建外部表。如果文件的名称像 .snappy,Hive会自动识别它们。您可以指定SNAPPY输出格式来编写表:

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
;
  1. JSONSerDe可以解析所有复杂结构,比使用json_tuple更容易。Json中的简单属性像表格列一样映射到列中,方括号 [] 中的所有内容都是数组<>,大括号 {}中的内容是一个 struct<> 或 map<>,复杂类型可以被嵌套。仔细阅读Readme:https://github.com/rcongiu/Hive-JSON-Serde, 有一个关于嵌套结构的部分和许多CREATE TABLE的示例。

  2. 如果还想使用json_tuple,则创建只有一个STRING列的表,然后使用 json_tuple 进行解析。但这将会更加困难。

  3. 所有JSON记录都应该在一行内(对象内没有换行符,也没有\r)。这和这里提到的一样:https://github.com/rcongiu/Hive-JSON-Serde


这部分是否启用了JSON Snappy读取是TableProperties吗? - tensor
读取 snappy 格式的数据是否需要使用 json serde(是或否)?我无法在我的环境中安装外部 jar 包。 - quantCode
@quantCode 如果文件是CSV、TSV或ctrl_A分隔的,则不需要JSONSerDe。仅在读取JSON时需要JSONSerDe。无论是否使用SNAPPY压缩,都没有关系。如果您需要读取JSON并且无法添加JAR,则可以尝试本地Hive JSONSerDe:'org.apache.hive.hcatalog.data.JsonSerDe'。它应该已经安装好了。在此处阅读更多详细信息:https://docs.aws.amazon.com/athena/latest/ug/json-serde.html - leftjoin
@quantCode SNAPPY是一种压缩编解码器。Hive本身可以压缩和解压SNAPPY。压缩编解码器和JSON没有任何关系。CSV文件也可以使用SNAPPY进行压缩。 - leftjoin
1
好的,谢谢。我的主要问题是压缩JSON的快速部分。 - tensor

2
如果您的数据被分区(例如按日期),请在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

使用此命令可以修复Hive表中的分区。在进行分区恢复之前,您可能会发现表看起来像是空的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接