Como carregar json snappy compactado em HIVE

Oct 14 2020

Eu tenho um monte de arquivos compactados rápidos JSON no HDFS. Eles são HADOOP compactados rapidamente (não python, cf outras questões SO) e têm estruturas aninhadas.

Não foi possível encontrar um método para carregá-los no HIVE (usando json_tuple)?

Posso obter alguns recursos / dicas sobre como carregá-los

Referências anteriores (não tem respostas válidas)

pyspark como carregar arquivo rápido compactado

Hive: analisando JSON

Respostas

4 leftjoin Oct 21 2020 at 22:55
  1. Coloque todos os arquivos na pasta HDFS e crie uma tabela externa em cima dela. Se os arquivos tiverem nomes como .snappy, o Hive os reconhecerá automaticamente, embora você possa especificarTBLPROPERTIES ("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")
;
  1. JSONSerDe pode analisar todas as estruturas complexas, é muito mais fácil do que usar json_tuple. Atributos simples em json são mapeados para colunas como estão Todos nos colchetes [] é uma matriz <>, em {} é uma estrutura <> ou mapa <>, tipos complexos podem ser aninhados. Leia com atenção o Leiame:https://github.com/rcongiu/Hive-JSON-Serde. Há uma seção sobre estruturas aninhadas e muitos exemplos de CREATE TABLE.

  2. Se você ainda quiser usar json_tuple, crie uma tabela com uma coluna STRING única e analise usando json_tuple. Mas é muito mais difícil.

  3. Todos os registros JSON devem estar em uma única linha (sem novas linhas dentro de objetos JSON, assim como \ r). O mesmo é mencionado aquihttps://github.com/rcongiu/Hive-JSON-Serde

2 FrançoisB. Oct 27 2020 at 07:03

Se seus dados forem particionados (por exemplo, por data)

Crie a tabela no 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'

Recupere a partição (antes da recuperação, a mesa parece estar vazia)

MSCK REPAIR TABLE database.table